我有一个来自旧项目的课程,可以构建我的所有HTML电子邮件。我将视图模型传递给具有所有适当项的方法。这些视图模型是根据显示的类构建的。我现在想要使用DI,因为我使用的是Asp.Net Core 2
public static class EmailViewModel
{
private static readonly string AppName = "Company Name";
private static readonly IAppConfiguration _appConfig;
public class AccountClosedEmailViewModel : IEmailViewModel
{
public AccountClosedEmailViewModel()
{
ApplicationName = AppName;
EmailName = "Account Closed";
}
public string FullName { get; set; }
public string EmailName { get; set; }
public string ApplicationName { get; set; }
public string Username { get; set; }
public string RenewRegistrationUrl { get; set; }
}
...rest removed for brevity
我想使用appsettings.json中的配置来引入此类所需的值,而不是将它们作为私有字段设置在类的顶部。
//don't want to do this
private static readonly string AppName = "Company Name";
//want to do this
private readonly IAppConfiguration _appConfig;
//and in the code use _appConfig.AppName
但是因为这是一个静态类,我不能有一个带参数的构造函数来引入配置。我不是一个专业的程序员,所以这个问题一直困扰着我。我如何让它工作?我花了大量时间尝试各种更改,但仍然无法做到正确。
每晚更新OwW888的建议:
我写了一个新课
public class EmailModel : IEmailModel
{
private static IAppConfiguration _appConfig;
private static IAzureConfiguration _azureConfig;
public string TemplateHtml { get; set; }
public EmailModel(IAppConfiguration config, IAzureConfiguration azureConfig)
{
_appConfig = config;
_azureConfig = azureConfig;
TemplateHtml = TemplateHtmlFromMaster();
}
public string TemplateHtmlFromMaster()
{
var filepath = Path.Combine(_azureConfig.AzureBaseBlob, _azureConfig.AzureEmailTemplatePath,
"EmailMaster.html");
return File.ReadAllText(filepath)
.Replace("{year}", DateTime.Now.Year.ToString()
.Replace("{applicationname)", _appConfig.AppName));
}
public class AccountClosedEmailViewModel : IEmailViewModel
{
public AccountClosedEmailViewModel()
{
ApplicationName = _appConfig.AppName;
EmailName = "Account Closed";
}
public string FullName { get; set; }
public string EmailName { get; set; }
public string ApplicationName { get; set; }
public string Username { get; set; }
public string RenewRegistrationUrl { get; set; }
}
}
我在Startup.cs中注册了它
services.AddSingleton<IEmailModel, EmailModel>();
但是当我尝试在其他地方使用它时
var em = new EmailModel();
它错了,intellisense表明我需要传递两个预期的参数。需要说明的是,此代码位于解决方案中的Services项目(类库Asp.Net Core 2)中,而不是Asp.Net Web应用程序项目中。
非常感谢任何让我了解其工作原理并使其发挥作用的帮助。