以前Autofac時間を使用し、ちょうどAsImplementInterfaces()は非常に簡単に一括登録機能することができます。内蔵のDIフレームワークasp.netコアは、単純なネイティブDI一括登録機能を実現するために、独自の拡張を書き、考慮にAutofacフレームワークを置き換えるために、やや面倒なプロセスを取って、無容易に利用可能な一括登録方法です
Startup.cs拡張
1 パブリック 静的 クラスStartUpExtenions 2 { 3 /// <まとめ> 4 /// 一括登録サービス 。5 /// </要約> 6 /// <PARAM NAME = "サービス"> DIサービス</ PARAM> 7 // / <PARAM NAME = "assemblys"> 一括登録組立セット必要</ PARAM>を 8 /// <PARAM NAME = "baseType"> 基底クラス/インタフェース</ PARAM> 9 /// <PARAM NAME =「serviceLifetime 「> サービスのライフサイクル</ PARAM> 10 ///は <A> </ A>が返し 11 公共の 静的BatchRegisterService IServiceCollection(この IServiceCollectionサービス、アセンブリ[] assemblys、baseTypeタイプ、ServiceLifetime serviceLifetime = ServiceLifetime.Singleton) 12である { 13は リスト<タイプ> = typelistに新しい新しいリスト<タイプ>(); // すべてのクラスの集合登録条件満たし 14 のforeachを(VARのアセンブリでassemblys) 15 { 16 // 現在のフィルタアセンブリ修飾クラス 17の VARのタイプassembly.GetTypes =()。ここで、(T =>!t.IsInterface &&!t.IsSealed &&!&& t.IsAbstract baseType.IsAssignableFrom(T)); 18は IF(!種類= ヌル && types.Count()> 0 ) 19 typeList.AddRange(タイプ); 20 } 21 であれば(typeList.Count()== 0 ) 22 リターンサービス。 23 24 VAR typeDic = 新しい辞書<タイプ、タイプ[]>(); // 待注册集合 25 のforeach(VARのタイプにタイプリスト) 26 { 27の VARのインターフェイス= type.GetInterfaces()。 // 获取接口 28 typeDic.Add(タイプ、インターフェース); 29 } 30 IF(typeDic.Keys.Count()> 0 ) 31である { 32 のforeach(VARの instanceType でtypeDic.Keys) 33であり 、{ 34は foreachの(VARの InterfaceTypeはでtypeDic [instanceType]) 35 { 36 // の指定されたライフサイクルに応じてレジスタ 37 スイッチ(serviceLifetime) 38である { 39 ケースServiceLifetime.Scoped: 40 services.AddScoped(InterfaceTypeは、instanceType)。 41 ブレーク; 42 ケースServiceLifetime.Singleton: 43 services.AddSingleton(InterfaceTypeは、instanceType)。 44 ブレーク; 45 ケースServiceLifetime.Transient: 46 services.AddTransient(InterfaceTypeは、instanceType)。 47 ブレーク; 48 } 49 } 50 } 51 } 52の リターンサービス。 53 } 54 }
ConfigureServicesで一括登録プロセスを呼び出します
1 services.BatchRegisterService(新しいアセンブリ[] {Assembly.GetExecutingAssembly()、Assembly.Load(" Test.DAL ")}、typeof演算(IDependency))。
道によるテストは、登録されたサービスクラスの仕事の延長一括登録を使用します