静态类不能使用配置Asp Net Core 2

时间:2018-03-25 16:09:26

标签: c# class static

我有一个来自旧项目的课程,可以构建我的所有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应用程序项目中。

非常感谢任何让我了解其工作原理并使其发挥作用的帮助。

0 个答案:

没有答案