2016-11-03 15 views
29

我正在將ASP.NET 5 RC1項目遷移到ASP.NET Core,並遇到了一個我尚未見過的有趣問題,或者找到了解決方案。啓動時的ASP.NET核心配置部分

爲了內啓動使用的配置設置我以前retrived配置方式如下

// Works fine for DI both in ASP.NET 5 RC1 and ASP.NET Core 
services.Configure<SomeConfigurationClass>(Configuration.GetSection("SomeConfigurationSection")); 

// How I previous retrieved the configuration for use in startup. 
// No longer available in ASP.NET Core 
var someConfigurationToUseLater = Configuration.Get<SomeConfigurationClass>("SomeConfigurationSection"); 

更新到ASP.NET核心後1.0似乎Configuration.Get <牛逼>()不再可用。

我試過更新代碼來使用Configuration.GetValue <T>()但是,這似乎不適用於對象,並且只會在提供值的路徑時起作用。這給我留下了一個解決方法我的配置類的,像這樣

var someConfigurationName = "someConfiguration";  
var someConfigurationClass = new SomeConfigurationClass() 
{ 
    Value1 = Configuration.GetValue<string>($"{someConfigurationName}:value1"), 
    Foo = Configuration.GetValue<string>($"{someConfigurationName}:foo"), 
    Bar = Configuration.GetValue<string>($"{someConfigurationName}:bar") 
}; 

然而,這是一個問題,當配置類包含對象的數組。在我的情況下,客戶對象的數組

public class ClientConfiguration 
{ 
    public Client[] Clients { get; set; } 
} 

用下面的配置

"configuredClients": { 
    "clients": [ 
    { 
     "clientName": "Client1", 
     "clientId": "Client1" 
    }, 
    { 
     "clientName": "Client2", 
     "clientId": "Client2" 
    } 
    ] 
} 

如果這之前會綁定到我的配置類沒有問題的客戶財產,我再也找不到的一種方式在ASP.NET 1.0的核心

回答

46

這樣回答更新
對於ASP核心1.1.0通用模型綁定使用現在做210:

var config = Configuration.GetSection("configuredClients").Get<ClientConfiguration>(); 

原來的答案
如何:

var config = Configuration.GetSection("configuredClients").Bind<ClientConfiguration>(); 
+0

對此方法的另一投票。我一直在使用這種方法幾個星期,並且它工作得很好。 –

+0

可能值得注意的是我必須將Microsoft.Extensions.Configuration和Microsoft.Extentions.Options.ConfigurationExtensions更新到1.1.0-preview1-final –

+0

這是否已在1.1的最終版本中再次刪除? – AndyM

2

你不讀取配置手動一般在ASP.NET核心自己,而不是創建一個對象與您的定義相符。您可以在官方文檔here中閱讀更多內容。

E.g.

public class MyOptions 
{ 
    public string Option1 { get; set; } 
    public int Option2 { get; set; } 
} 

public void ConfigureServices(IServiceCollection services) 
{ 
    // Setup options with DI 
    services.AddOptions(); 
    services.Configure<MyOptions>(Configuration); 
} 

然後,您只需在需要它們的地方注入選項IOptions<MyOptions>

+0

即使配置對象和json對象按照您的建議相匹配,相同的方式也不起作用,但我仍然無效。稍後配置服務並注入IOption似乎可以很好地檢索配置值。問題是當我試圖檢索這些值在啓動時使用 –

+0

我不是100%確定你的意思,但在Configure方法中使用DI容器可以幫助你嗎?我認爲可以在那裏使用容器,但無法找到如何做到這一點。 –

+0

這是一篇關於如何使用強類型配置節的不錯文章:[如何在ASP.NET Core RC2中使用IOptions模式進行配置](http://andrewlock.net/how-to-use-the-ioptions-配置在asp-net-core-rc2 /) – 108

0

如果你想獲得第一個 「客戶端名」(預期 「客戶端1」),只寫:

Configuration.GetSection("configuredClients")["clients:0:clientName"]; 

更新評論

安裝.NET核心1.0.1,並與@走TomMakin的方式。

+0

我想要的客戶端的完整列表,顯然是可配置的,有數量的客戶端需要在配置設置中稍後使用。所以不是一個真正可行的解決方案。 –

+0

安裝.NET Core 1.0.1並使用@ TomMakin的方式。 –

0

With ASP.NET Core 2.0(基本上是Core 1。1+),IConfiguration被注入到Startup,並且可以在ConfigureServices()Configure()方法中使用。

如接受的答案所示,可以將配置綁定到對象。但是,如果只需要一個價值,那麼基於關鍵的方法運作良好。

IConfiguration仍然與分號字符串鍵冒號:一起使用。而對於array,請使用基於0的索引。或者使用相同密鑰的通用getValue<T>()方法。見下面的例子:

var clientId2 = Configuration["configuredClients:clients:1:clientId"]?.ToString(); 
var clientName1 = Configuration.GetValue<string>("configuredClients:clients:0:clientName"); 

要使用在其它類相同的配置值(例如控制器)

  1. 要麼注入IConfiguration並使用相同的基於密鑰的方法等的上方。或
  2. 向DI容器註冊強類型配置對象的實例,並將該對象直接注入到客戶端類中。

樣品下面的代碼:

//In Startup.ConfigureServices() 
var clientConfig = Configuration.GetSection("configuredClients") 
    .Get<ClientConfiguration>(); 
services.AddSingleton(clientConfig); 

//Controller 
public class TestController : Controller 
{ 
    IConfiguration _configStore; 
    ClientConfiguration _clientConfiguration; 

    public TestController(IConfiguration configuration, 
     ClientConfiguration clientConfiguration) 
    { 
     _configStore = configuration; 
     _clientConfiguration = clientConfiguration; 
    } 

    public IActionResult Get() 
    { 
     //with IConfiguration 
     var clientId1 = _configStore 
      .GetValue<string>("configuredClients:clients:0:clientId"); 

     //with strongly typed ClientConfiguration 
     var clientName1 = _clientConfiguration.Clients[0]?.ClientName; 

     return new OkObjectResult("Configuration test"); 
    } 
} 

更多實例here