.NET CORE3.1使用內建IOC自動注入
阿新 • • 發佈:2020-12-14
在.NET CORE中注入時需要在Startup的ConfigureServices中寫
services.AddScoped<IServices, Services>();
專案如果比較大,每次寫起來就會很麻煩,所以需要讓程式可以自動注入
首先新建兩個介面 IDenpendency,IDenpendcySingleton,或者使用特性也可以。
/// <summary> /// 使用Scoped方式注入 /// </summary> public interface IDenpendency { } /// <summary> /// 使用Singleton方式注入 /// </summary> public interface IDenpendcySingleton { } /// <summary> /// 業務介面繼承其中一個 /// </summary> public interface IStockInAppService: IDenpendency { }
在web專案中新建一個DIDataService的靜態類
public static class DIDataService { public static IServiceCollection AddDataService(this IServiceCollection services) { #region 處理依賴注入 var transientType = typeof(IDenpendency); //每次新建 var singletonType = typeof(IDenpendcySingleton); //全域性唯一 var allTypes = AppDomain.CurrentDomain.GetAssemblies() //.FirstOrDefault(t => t.FullName.Contains("AbpCore.InterfaceServices.Application")) ////獲取所有物件 //.GetTypes() .SelectMany(a => a.GetTypes().Where(t => t.GetInterfaces().Contains(transientType) || t.GetInterfaces().Contains(singletonType))); //class的程式集 var implementTypes = allTypes.Where(x => x.IsClass).ToArray(); //介面的程式集 var interfaceTypes = allTypes.Where(x => x.IsInterface).ToArray(); foreach (var implementType in implementTypes) { var interfaceType = interfaceTypes.FirstOrDefault(x => x.IsAssignableFrom(implementType)); //class有介面,用介面注入 if (interfaceType != null) { //判斷用什麼方式注入 if (interfaceType.GetInterfaces().Contains(transientType)) { services.AddScoped(interfaceType, implementType); } else if (interfaceType.GetInterfaces().Contains(singletonType)) { services.AddSingleton(interfaceType, implementType); } } else //class沒有介面,直接注入class { //判斷用什麼方式注入 if (implementType.GetInterfaces().Contains(transientType)) { services.AddTransient(implementType); } else if (implementType.GetInterfaces().Contains(singletonType)) { services.AddSingleton(implementType); } } } #endregion return services; } }
最後在Startup的ConfigureServices中注入DIDataService
services.AddDataService();
這樣就可以自動注入了,不用再操心注入啦