ASP.NET Core DIの概要
3858 ワード
周知の通り、ASP.NET CoreにはDIフレームワークがあり、アプリケーション起動時に初期化されます.
事前定義された依存
1:IApplicationBuilder:アプリケーションを構成するための要求パイプメカニズムを提供
2:ILoggerFactory:セカンダリタイプはレコーダコンポーネントを作成するモードを提供します
3:LhostinEnvironment:アプリケーションが実行するWebホスト環境を管理するための情報を提供します.
カスタム依存の登録
タイプを登録するには、抽象的なタイプを特定のタイプに解析する方法をシステムに知らせる必要があります.このマッピングは静的設定でも動的でもよいです.
ICustomerServiceを実装するタイプのインスタンスが要求されるたびに、システムはCustomerServiceのインスタンスを返します.特に、AddTransientメソッドは、CustomerSerivceタイプの新しいインスタンスが毎回返されることを保証します.
静的解析には一定の限界がある場合がある.実際、実行時条件に基づいてタイプTを異なるタイプに解析する必要がある場合、依存関係を解析するためにコールバック関数を指定することができる.
構成データの収集
これまでの構成はwebで行われていたことはよく知られています.configファイルクラスは構成を取得し、Coreでより豊富で複雑なインフラストラクチャを提供します.
名前-値ペアのリストに基づいて構成されます.1:Jsonデータプロバイダ,2:環境変数プロバイダ,3:メモリプロバイダ.4:カスタム構成プロバイダ.
カスタム構成については、IConfigurationSourceインタフェースのクラスを実装する必要がありますが、実装時にはコンフィギュレーションProviderから統合されたカスタムクラスを参照する必要があります.
事前定義された依存
1:IApplicationBuilder:アプリケーションを構成するための要求パイプメカニズムを提供
2:ILoggerFactory:セカンダリタイプはレコーダコンポーネントを作成するモードを提供します
3:LhostinEnvironment:アプリケーションが実行するWebホスト環境を管理するための情報を提供します.
カスタム依存の登録
タイプを登録するには、抽象的なタイプを特定のタイプに解析する方法をシステムに知らせる必要があります.このマッピングは静的設定でも動的でもよいです.
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient();
}
ICustomerServiceを実装するタイプのインスタンスが要求されるたびに、システムはCustomerServiceのインスタンスを返します.特に、AddTransientメソッドは、CustomerSerivceタイプの新しいインスタンスが毎回返されることを保証します.
静的解析には一定の限界がある場合がある.実際、実行時条件に基づいてタイプTを異なるタイプに解析する必要がある場合、依存関係を解析するためにコールバック関数を指定することができる.
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient(provider=> {
var context = provider.GetRequiredService();
if (SomeRuntimeConditionHolds(context.HttpContext.User))
return new CustomerServiceMatchingRuntionCondition();
else
return new DefaultCustomerService();
});
}
構成データの収集
これまでの構成はwebで行われていたことはよく知られています.configファイルクラスは構成を取得し、Coreでより豊富で複雑なインフラストラクチャを提供します.
名前-値ペアのリストに基づいて構成されます.1:Jsonデータプロバイダ,2:環境変数プロバイダ,3:メモリプロバイダ.4:カスタム構成プロバイダ.
カスタム構成については、IConfigurationSourceインタフェースのクラスを実装する必要がありますが、実装時にはコンフィギュレーションProviderから統合されたカスタムクラスを参照する必要があります.
public class MyDatabaseConfigSoure : IConfigurationSource
{
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
throw new MyDatabaseConfigProvider();
}
}
public class MyDatabaseConfigProvider : ConfigurationProvider
{
private const string ConnectionString = "";
public override void Load()
{
using (var db = new MyDatabaseContext(ConnectionString))
{
//..
}
}
}