2017-10-09 78 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

我希望是明確的和有益的

相關問題