2017-10-09 46 views
0

在没有阅读完整个问题的人投票之前,这已经被问到了,我在这里读到了十几个关于SO的问题,并且至少有4篇博文但是我不能在具有多个类库项目的VS2017解决方案中工作。不过,我可以通过一个带有Web应用程序和一个类库的解决方案来工作,尽管它的格式与我在文档中找到的格式不同,但在这里也是如此。从核心2.0中的类库访问appsettings.json中的设置

我的解决方案包含5个项目web应用,测试,基础设施,服务,域名(后三者是类库)

在我创建了一个类名为EmailConfigurationSettings和启动类注册它的基础设施项目WebApp。

这个类是类库

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

这是StartUp.cs的Web应用程序。

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

appsettings.json

"EmailConfigurationSettings": { 
    "Provider": "gmail", 
    "Username": "[email protected]", 
    "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我不知道,这很容易。

回答

0

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

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

一旦你这样做了,你所要做的就是在你的服务层构造函数中请求一个EmailConfigurationSettings的副本。这会给你注入该对象的依赖注入单例。

我会在“绑定”上设置一个断点,并确保填充了电子邮件配置。

+0

运行项目在AddSingleton ca上放置一个断点ll(在StartUp.cs中)产生一个空的emailConfig。所以这不起作用,与OP方法一样。 – dinotom

+0

如果这样会产生空结果,那么他还没有正确加载他的应用程序配置。此代码取自我的个人mvc应用程序,所以我知道它的工作原理。如果你设置一个变量返回getsection我会睡觉它返回null – willthiswork89

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

我希望是明确的和有益的

相关问题