ASP.NET 5 RC1プロジェクトをASP.NET Coreに移行しようとしていますが、まだ見たことのない、または解決策を見つけられなかった興味深い問題に出会いました。
スタートアップで構成設定を使用するために、以前に次の方法で構成を取得しました
// 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 Core 1.0に更新した後、Configuration.Get <T>()は使用できなくなったようです。
Configuration.GetValue <T>()を使用するようにコードを更新しようとしましたが、これはオブジェクトでは機能しないようで、値へのパスを提供する場合にのみ機能します。これにより、構成クラスのmostの回避策が残りました。
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")
};
ただし、構成クラスにオブジェクトの配列が含まれる場合、これは問題です。私の場合、Clientオブジェクトの配列
public class ClientConfiguration
{
public Client[] Clients { get; set; }
}
次の構成で
"configuredClients": {
"clients": [
{
"clientName": "Client1",
"clientId": "Client1"
},
{
"clientName": "Client2",
"clientId": "Client2"
}
]
}
以前はこれが私の構成クラスのClientsプロパティに問題なくバインドされていましたが、ASP.NET Core 1.0でこれを行う方法を見つけることができません
更新された回答
For ASP Core 1.1.0ジェネリックモデルバインディングはGet
を使用して行われます:
var config = Configuration.GetSection("configuredClients").Get<ClientConfiguration>();
元の回答
これはどう:
var config = Configuration.GetSection("configuredClients").Bind<ClientConfiguration>();
ASP.NET Core 2.0(基本的にCore 1.1+)では、IConfiguration
がStartup
に挿入され、 ConfigureServices()
およびConfigure()
メソッド内で使用できます。
受け入れられた回答に示されているように、構成はオブジェクトにバインドできます。ただし、必要な値が1つだけの場合は、キーベースのアプローチが適切に機能します。
IConfiguration
は引き続き、コロン_:
_で区切られた文字列キーで機能します。 array
には、0ベースのインデックスを使用します。または、同じキーで汎用getValue<T>()
メソッドを使用します。以下の例を参照してください。
_var clientId2 = Configuration["configuredClients:clients:1:clientId"]?.ToString();
var clientName1 = Configuration.GetValue<string>("configuredClients:clients:0:clientName");
_
他のクラス(コントローラーなど)で同じ構成値を使用するには
IConfiguration
を注入し、上記と同じキーベースのアプローチを使用します。または以下のサンプルコード:
_//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");
}
}
_
その他の例 こちら 。
通常、ASP.NET Coreで構成を手動で手動で読み取るのではなく、定義に一致するオブジェクトを作成します。詳細については、公式ドキュメント here をご覧ください。
例えば。
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>
必要な場所。
最初の「clientName」(予期される「Client1」)を取得する場合は、次のように記述します。
Configuration.GetSection("configuredClients")["clients:0:clientName"];
コメントの更新
.NET Core 1.0.1をインストールして、@ TomMakinの方法で進めます。