asp.net core 批量依賴注入服務


看園子里netcore的文章都是簡單的注入幾個服務的例子,在項目中肯定不會一行一行的寫注冊服務的代碼,參考網上,找到一些解決方案,根據自己實際需求進行更改,特記錄下來。

 

先創建一個 Startup.cs 擴展類,對IServiceCollection進行擴展

 public static class IServiceCollectionExtenions
    {
        /// <summary>
        /// 獲取程序集中的類
        /// </summary>
        /// <param name="assemblyName">程序集名</param>
        /// <returns></returns>
        private static Dictionary<Type, Type> GetClassName(string assemblyName)
        {
            var result = new Dictionary<Type, Type>();
            if (!string.IsNullOrWhiteSpace(assemblyName))
            {
                //排除程序程序集中的接口、私有類、抽象類
                Assembly assembly = Assembly.Load(assemblyName);
                var typeList = assembly.GetTypes().Where(t => !t.IsInterface && !t.IsSealed && !t.IsAbstract).ToList();
                //歷遍程序集中的類
                foreach (var item in typeList)
                {
                    //查找當前類繼承且包含當前類名的接口
                    var interfaceType = item.GetInterfaces().Where(o => o.Name.Contains(item.Name)).FirstOrDefault();
                    if (interfaceType != null)
                    {
                        //把當前類和繼承接口加入Dictionary
                        result.Add(item, interfaceType);
                    }
                }
            }
            return result;
        }
        /// <summary>
        /// 批量注冊
        /// </summary>
        /// <param name="services"></param>
        /// <param name="assemblyName">程序集名</param>
        /// <param name="lifetime">服務生命周期</param>
        public static void BatchRegisterService(this IServiceCollection services, string assemblyName, ServiceLifetime lifetime = ServiceLifetime.Scoped)
        {
            foreach (var item in GetClassName(assemblyName))
            {
                //根據生命周期注冊
                switch (lifetime)
                {
                    case ServiceLifetime.Scoped:
                        services.AddScoped(item.Value, item.Key);
                        break;
                    case ServiceLifetime.Singleton:
                        services.AddSingleton(item.Value, item.Key);
                        break;
                    case ServiceLifetime.Transient:
                        services.AddTransient(item.Value, item.Key);
                        break;
                }
            }
        }
    } 

然后在 Startup.cs 中服務注冊

  public void ConfigureServices(IServiceCollection services)
  {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        #region 依賴注冊
//泛型注冊 services.AddScoped(typeof(IRepository<>), typeof(Repository<>)); services.AddScoped<IRepositoryFactory, RepositoryFactory>(); //按程序集名稱批量注冊 services.BatchRegisterService("Com.Service"); #endregion }

 經測試 ,使用擴展批量注冊的方式注冊的服務類正常工作


免責聲明!

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



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