从Core 2.0中的类库访问appsettings.json中的设置

时间:2017-10-09 20:14:15

标签: c# json asp.net-core-2.0 appsettings

我已经在SO和至少4篇博客文章中阅读了十几个问题,但我无法在具有多个类库项目的VS2017解决方案中使用它。但是,我可以让它使用带有Web应用程序和一个类库的解决方案,虽然模式与我在文档中找到的模式不同,这里也是SO。< / p>

我的解决方案包含5个项目:WebApplication,测试,基础架构,服务,域(后三个是类库)。

在基础结构项目中,我创建了一个名为EmailConfigurationSettings的类,并将其注册到WebApp的StartUp类中。

这个类在类库中:

public class EmailConfigurationSettings
{
    public string Provider { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}

这是在WebApp中的StartUp.cs中:

services.Configure<EmailConfigurationSettings>(Configuration.GetSection("EmailConfigurationSettings"));
services.AddOptions();

appsettings.json

"EmailConfigurationSettings": {
  "Provider": "gmail",
  "Username": "user@gmail.com",
  "Password": "mypassword" 
} 

我需要服务项目中的设置。但是现在我只是想确保我能够真正检索它们。下面的代码遵循我找到但生成的所有代码示例:

public class LoadEmailSettingsFromAppSettings
{
    private readonly IOptions<EmailConfigurationSettings> _emailSettings;

    public LoadEmailSettingsFromAppSettings(IOptions<EmailConfigurationSettings> emailSettings)
    {
        _emailSettings = emailSettings;
        Message = "Our provider is " + _emailSettings.Value.Provider;
    }

    public string Message { get; set; }
}

_emailSettings始终为空

所以我尝试在TestProject中测试它:

IOptions<EmailConfigurationSettings> someOptions = Options.Create<EmailConfigurationSettings>(new EmailConfigurationSettings());

嗯,那也是空的。

在另一个解决方案中,具有WebApp和一个类库的解决方案, 使用我在其中一个博客上找到的稍微不同的模式,我可以实际从appsettings.json中检索值:

public class AuthMessageSender : IEmailSender, ISmsSender
{
    public AuthMessageSender(IOptions<EmailConfig> emailSettings)
    {
        _emailSettings = emailSettings.Value;
    }

    public EmailConfig _emailSettings { get; }

    public Task SendEmailAsync(string email, string subject, string message)
    {
        Execute(email, subject, message).Wait();
        return Task.FromResult(0);
    }

Class populated from appsettings.json

请注意,IOptions类与9个属性不同,但构造方式与上面的模式相同。

但是使用这种模式在多类库项目中工作。如何理解如何在多类库场景中使用它?

为什么他们放弃了ConfigurationManager,我不知道,这要容易得多。

2 个答案:

答案 0 :(得分:0)

在微服务中,您可以简单地绑定到与json定义匹配的新对象。所以你会这样做。

var emailConfig = new EmailConfigurationSettings();
Configuration.GetSection("EmailConfigurationSettings").Bind(emailConfig);
services.AddSingleton(emailConfig);

完成此操作后,您所要做的就是在服务层构造函数中请求EmailConfigurationSettings的副本。这将为您提供该对象的依赖注入单例。

我会在&#34; bind&#34;上设置一个断点。并确保填充了电子邮件配置。

答案 1 :(得分:0)

以下是关于类库的有趣答案:Class library

在这部分代码中:

private readonly IOptions<EmailConfigurationSettings> _emailSettings;

public LoadEmailSettingsFromAppSettings(IOptions<EmailConfigurationSettings> emailSettings)
{
    _emailSettings = emailSettings;         

依赖注入不起作用,因为你在类库中,所以你应该保持这种方式。

在您的webapp中的某个位置构建LoadEmailSettingsFromAppSettings

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}

私人只读应该是:

public IOptions<EmailConfigurationSettings> EmailSettings {get; private set;}

readonly vs get/set properties

我希望明确而有帮助