在ASP.NET Core中實現自動注入、批量注入


我們在使用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;
        }
    }
View Code

第五步:在Startup.cs調用AddDataService方法進行批量注入

 

 

 

 本人原創文章,非商業用途可隨意轉載,轉載請保留原文出處 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM