首页 > 解决方案 > 带有剃须刀页面的 asp.net 核心中的常用服务

问题描述

作为参考,我有一个BasePageModel继承PageModel.

我还有几项我会一直使用的服务:

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

有没有办法总是注入这些,这样我就不必在每个 Razor 页面上为每个服务进行构造函数注入?

标签: razorasp.net-corerazor-pages

解决方案


通常,您可以使用_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),因为您很可能不想将其提交到源代码管理中。


推荐阅读