咱們在使用AddScoped、AddTransient、AddSingleton這類方法的時候非常麻煩。咱們每增長一個接口以及其實現的時候,是否是須要在這裏硬編碼註冊一行代碼呢?項目小還好,但當咱們的項目變得龐大以後,這裏的依賴注入怎麼來維護呢?
在網上翻了半天,看了不少方法,其代碼的實現我的感受都不是太優雅,想一想仍是本身寫一個比較實用吧,咱們只需按照一個規定來定義和實現接口。應用程序就能自動掃描並註冊這些程序集中的接口和對應實現類,完成依賴注入的自動註冊,具體的實現能夠經過接口或特性來實現,若是須要區分AddScoped、AddTransient、AddSingleton能夠經過定義不一樣的接口去實現,這裏咱們定義IDenpendency接口作演示,具體實現以下: ide
第一步:建立以下這樣一個空接口this
public interface IDenpendency { }
第二步:建立須要注入的功能接口,這類接口就是你想實現某些功能的封裝,它們都繼承第一步建立的接口IDenpendency,以下,我建立一個功能接口編碼
public interface IUserService:IDenpendency
{
//function
}
第三步:實現須要注入的功能接口,以下,我建立了一個實現UserService的類spa
public class UserService:IUserService
{
//function的具體實現
}
第四步:擴展IServiceCollection批量注入方法AddDataServicecode
public static class DataServiceExtension { /// <summary> /// 注入數據 /// </summary> /// <param name="services"></param> public static IServiceCollection AddDataService(this IServiceCollection services) { #region 依賴注入 //services.AddScoped<IUserService, UserService>(); var baseType = typeof(IDependency); var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory; var referencedAssemblies = System.IO.Directory.GetFiles(path, "*.dll").Select(Assembly.LoadFrom).ToArray(); var types = referencedAssemblies .SelectMany(a => a.DefinedTypes) .Select(type => 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 (var implementType in implementTypes) { var interfaceType = interfaceTypes.FirstOrDefault(x => x.IsAssignableFrom(implementType)); if (interfaceType != null) services.AddScoped(interfaceType, implementType); } #endregion return services; } }
第五步:在Startup.cs調用AddDataService方法進行批量注入blog
本人原創文章,非商業用途可隨意轉載,轉載請保留原文出處 繼承