私たちは、これらの方法のAddScoped、AddTransient、AddSingletonを使用するとき、それは面倒です。私たちはそれぞれの追加インターフェースとその実装がここで必要と登録されていない場合、コードのハードコーディングされた行はありますか?幸いなことに、小さなプロジェクトの後、私たちは、依存性の注入は、それを維持するためにどのように巨大なプロジェクトになったときに?
長い時間のためのオンラインターンでは、我々は唯一の規定に従ったインターフェースを定義し、実装する必要があり、メソッドの実装コードの多くが考える、または今より実用的に書くために、非常にエレガントな雰囲気ではありません見て。アプリケーションが自動的にスキャンして登録アセンブリに対応これらのインタフェースと実装クラスを、自動登録の依存性注入を完了するために必要であれば、特定の実装はAddScoped、AddTransientを区別するために、インターフェイスまたは特徴によって実現されてもよいことができ、AddSingletonは異なる定義することができ達成するためのインタフェースを、私たちは次のことを達成するための具体的な、インターフェースIDenpendencyのプレゼンテーションを定義します:
ステップ1:インターフェイスなどのスペースを作成します。
パブリック インターフェース IDenpendency {}
ステップ2:私は、機能のインターフェースを作成するように注入する必要がある機能インタフェースを作成し、これらのインタフェースを使用すると、パッケージの機能のいくつかを達成したいのか、それらは、作成中のインターフェイスIDenpendency第一歩を継承されています
パブリック インターフェース IUserService:IDenpendency
{
//関数
}
第三段階:機能インターフェイスは注入する必要達成するためには、私はUserServiceのを実装するクラスを作成し、次
パブリック クラス UserServiceの:IUserService
{
//関数が実施されます
}
ステップ4:拡張IServiceCollectionバッチ注入法のAddDataService
パブリック 静的 クラスDataServiceExtension { /// <要約> /// 注入数据 /// </要約> /// <PARAM NAME = "サービス"> </ PARAM> パブリック 静的 IServiceCollection AddDataService(このIServiceCollectionサービス) { #region依赖注入 // services.AddScoped <IUserService、UserServiceの>(); VaRの baseType = typeof演算(IDependency)。 VARのパス= AppDomain.CurrentDomain.RelativeSearchPath?AppDomain.CurrentDomain.BaseDirectory; VARreferencedAssemblies = System.IO.Directory.GetFiles(パス、" * .dllは" ).Select(Assembly.LoadFrom).ToArray(); VaRの種類= referencedAssemblies .SelectMany( => a.DefinedTypes) .Select(タイプ => type.AsType()) .Where(X => X = baseType &&!baseType.IsAssignableFrom(X))てToArray(); VAR implementTypes = types.Where(X => x.IsClass).ToArray(); VAR interfaceTypes = types.Where(X => x.IsInterface).ToArray(); foreachの(VARimplementType でimplementTypes) { VAR InterfaceTypeは= interfaceTypes.FirstOrDefault(X => x.IsAssignableFrom(implementType))。 もし(!InterfaceTypeは= ヌル) services.AddScoped(InterfaceTypeは、implementType)。 } #endregion 返すサービスを、 } }
ステップ4:Startup.csでAddDataServiceバッチ注入メソッドを呼び出し
私のオリジナルの記事は自由に非商用目的のために再現することができ、オリジナルのソースを残して再現