web-dev-qa-db-ja.com

スタートアップのASP.NET Core構成セクション

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でこれを行う方法を見つけることができません

40
Aaron Bamford

更新された回答
For ASP Core 1.1.0ジェネリックモデルバインディングはGetを使用して行われます:

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

元の回答
これはどう:

var config = Configuration.GetSection("configuredClients").Bind<ClientConfiguration>();
62
Tom Makin

ASP.NET Core 2.0(基本的にCore 1.1+)では、IConfigurationStartupに挿入され、 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");
_

他のクラス(コントローラーなど)で同じ構成値を使用するには

  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");
    }
}
_

その他の例 こちら

5
Arghya C

通常、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>必要な場所。

2

最初の「clientName」(予期される「Client1」)を取得する場合は、次のように記述します。

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

コメントの更新

.NET Core 1.0.1をインストールして、@ TomMakinの方法で進めます。

0
adem caglin