带有剃须刀页面的asp.net核心中的常见服务

时间:2019-01-02 15:18:25

标签: razor asp.net-core razor-pages

作为参考,我有一个通用的BasePageModel,它继承了PageModel

我还有一些将始终使用的服务:

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

是否有办法始终注入这些内容,这样我就不必在每个Razor页面上为这些服务的每一个进行构造函数注入?

1 个答案:

答案 0 :(得分:3)

通常,您可以使用_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 Key Vault交换生产SMTP连接设置。最好不要为此使用appsettings.json(或appsettings.Production.json),因为您很可能不想将其提交到源代码管理中。