asp.net 核心中的公共服务,带有 razor 页面
common services in asp.net core with razor pages
作为参考,我有一个通用的 BasePageModel
继承了 PageModel
。
我还有一些我会一直使用的服务:
UserManager<AppUser> userManager
IHttpContextAccessor httpContextAccessor
IHostingEnvironment env
有没有办法始终注入这些,这样我就不必在每个 Razor 页面上为这些服务中的每一个进行构造函数注入?
通常,您可以使用 _ViewImports.cshtml
定义要注入到每个视图中的服务。只需在那里添加您的视图注入,该服务将可用于每个视图。
但是,对于您明确提到的三种服务中的任何一种,您都不应该这样做。首先,IHttpContextAccessor
是不必要的,因为您可以通过 ViewContext.HttpContext
在您的视图中获得 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 的应用程序,它是开源且免费的,它使开发中的 sending/receiving 电子邮件变得轻而易举。默认情况下,它将绑定到 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),因为您很可能不想将其提交到源代码管理中。
作为参考,我有一个通用的 BasePageModel
继承了 PageModel
。
我还有一些我会一直使用的服务:
UserManager<AppUser> userManager
IHttpContextAccessor httpContextAccessor
IHostingEnvironment env
有没有办法始终注入这些,这样我就不必在每个 Razor 页面上为这些服务中的每一个进行构造函数注入?
通常,您可以使用 _ViewImports.cshtml
定义要注入到每个视图中的服务。只需在那里添加您的视图注入,该服务将可用于每个视图。
但是,对于您明确提到的三种服务中的任何一种,您都不应该这样做。首先,IHttpContextAccessor
是不必要的,因为您可以通过 ViewContext.HttpContext
在您的视图中获得 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 的应用程序,它是开源且免费的,它使开发中的 sending/receiving 电子邮件变得轻而易举。默认情况下,它将绑定到 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),因为您很可能不想将其提交到源代码管理中。