我們在使用AddScoped、AddTransient、AddSingleton這類方法的時候很是麻煩。我們每增加一個接口以及其實現的時候,是不是需要在這里硬編碼注冊一行代碼呢?項目小還好,但當我們的項目變得龐大之后,這里的依賴注入怎么來維護呢?
在網上翻了半天,看了很多方法,其代碼的實現個人感覺都不是太優雅,想想還是自己寫一個比較實用吧,我們只需按照一個規定來定義和實現接口。應用程序就能自動掃描並注冊這些程序集中的接口和對應實現類,完成依賴注入的自動注冊,具體的實現可以通過接口或特性來實現,如果需要區分AddScoped、AddTransient、AddSingleton可以通過定義不同的接口去實現,這里我們定義IDenpendency接口做演示,具體實現如下:
第一步:創建如下這樣一個空接口
public interface IDenpendency { }
第二步:創建需要注入的功能接口,這類接口就是你想實現某些功能的封裝,它們都繼承第一步創建的接口IDenpendency,如下,我創建一個功能接口
public interface IUserService:IDenpendency
{
//function
}
第三步:實現需要注入的功能接口,如下,我創建了一個實現UserService的類
public class UserService:IUserService
{
//function的具體實現
}
第四步:擴展IServiceCollection批量注入方法AddDataService

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方法進行批量注入
本人原創文章,非商業用途可隨意轉載,轉載請保留原文出處