.netCore2.0 程序集DI依賴註入
阿新 • • 發佈:2018-04-17
類型 interface eof face code generic adf con rtu
傳統的依賴註入確實簡單,但是隨著項目的擴展隨之而來的問題又來了,因為傳統的註入是單個類和接口註入的,加入項目的接口和類增加到了上百個的話,就需要在Startup.cs中復制註入上百次,雖然能解決問題,但是顯然有點笨拙。
下面介紹一個程序集DI依賴註入,即通過反射進行文件註入
首先通過反射獲取當前程序集
/// <summary> /// 通過程序集的名稱加載程序集 /// </summary> /// <param name="assemblyName"></param> /// <returns></returns>public static Assembly GetAssemblyByName(string assemblyName) { return AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(assemblyName)); }
程序集依賴註入方法,邏輯不多描述,全在註釋中
/// <summary> /// 程序集依賴註入 /// </summary> /// <param name="services">服務實例</param> /// <param name="assemblyName">程序集名稱。不帶DLL</param> /// <param name="serviceLifetime">依賴註入的類型 可為空</param> public static void AddAssembly(this IServiceCollection services, string assemblyName, ServiceLifetime serviceLifetime = ServiceLifetime.Scoped) {if (services == null) throw new ArgumentNullException(nameof(services) + "為空"); if (String.IsNullOrEmpty(assemblyName)) throw new ArgumentNullException(nameof(assemblyName) + "為空"); var assembly = RuntimeHelper.GetAssemblyByName(assemblyName); if (assembly == null) throw new DllNotFoundException(nameof(assembly) + ".dll不存在"); //找到當前程序集的類集合 var types = assembly.GetTypes(); //過濾篩選(是類文件,並且不是抽象類,不是泛型) var list = types.Where(o => o.IsClass && !o.IsAbstract && !o.IsGenericType).ToList(); if (list == null && !list.Any()) return; //遍歷獲取到的類 foreach (var type in list) { //然後獲取到類對應的接口 var interfacesList = type.GetInterfaces(); //校驗接口存在則繼續 if (interfacesList == null || !interfacesList.Any()) continue; //獲取到接口(第一個) var inter = interfacesList.First(); switch (serviceLifetime) { //根據條件,選擇註冊依賴的方法 case ServiceLifetime.Scoped: //將獲取到的接口和類註冊進去 services.AddScoped(inter, type); break; case ServiceLifetime.Singleton: services.AddScoped(inter, type); break; case ServiceLifetime.Transient: services.AddTransient(inter, type); break; } } }
具體在Startup.cs 中調用如下
//程序集依賴註入(General.Services程序集名稱) services.AddAssembly("General.Services");
.netCore2.0 程序集DI依賴註入