代码之家  ›  专栏  ›  技术社区  ›  Fraze

带有Razor页面的ASP.NET核心中的公共服务

  •  0
  • Fraze  · 技术社区  · 6 年前

    作为参考,我有一个共同点 BasePageModel 继承的 PageModel .

    我还将始终使用以下几种服务:

    1. UserManager<AppUser> userManager
    2. IHttpContextAccessor httpContextAccessor
    3. IHostingEnvironment env

    是否有一种方法可以始终注入这些服务,这样我就不必在每个Razor页面上为这些服务中的每一个进行构造函数注入了?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Chris Pratt    6 年前

    通常,可以使用 _ViewImports.cshtml . 只需在那里添加视图注入,该服务将对每个视图都可用。

    但是,对于您明确提到的三个服务中的任何一个,您都不应该这样做。第一, IHttpContextAccessor 是不必要的,因为你可以得到 HttpContext 在你看来,通过 ViewContext.HttpContext . 同样地, IHostingEnvironment 也是不必要的,因为您可以使用 environment 标签助手:

    <environment include="Development">
        <p>This is development.</p>
    </environment>
    <environment exclude="Development">
        <p>This is production.</p>
    </environment>
    

    为了 UserManager<AppUser> ,最好只在您真正需要的时候包含这样的服务。如果您发现自己一次又一次地需要这个服务,那么可以考虑创建一个标记助手或视图组件来封装这个逻辑,这样您就可以在多个地方使用它,而不必向视图中注入任何特殊的东西。

    最后,由于讨论的重点主要是在开发中不发送电子邮件,因此更好的方法是简单地用开发中的本地内容交换SMTP服务器。有一个叫做 Papercut 它是开源的,免费的,使在开发中收发电子邮件变得轻而易举。默认情况下,它将绑定到localhost:25,所以您只需要用它交换真正的SMTP连接。例如,您可以在appsettings.json中创建一个部分,如下所示:

    "Smtp": {
      "Host": "localhost",
      "Port": 25,
      "EnableSsl": false,
      "Username": "",
      "Password": ""
    }
    

    然后,在启动时:

    services.AddSingleton(_ => {
        var config = Configuration.GetSection("Smtp").Get<SmtpConfig>();
        return new SmtpClient
        {
            Host = config.Host,
            Port = config.Port,
            EnableSsl = config.EnableSsl,
            Credentials = new NetworkCredential(config.Username, config.Password)
        };
    });
    

    然后,简单地注入 SmtpClient 进入你的电子邮件服务,你就可以参加比赛了。在生产环境中,可以使用环境变量或Azure密钥库在生产SMTP连接设置中进行交换。最好不要为此使用appsettings.json(或appsettings.production.json),因为您很可能不想将其提交到源代码管理中。