zoukankan      html  css  js  c++  java
  • asp.netcore di 实现批量接口注入

    废话少说,先上代码
     public static Dictionary<Type, Type[]> GetImpleAndInterfaces(string assemblyName,string suffix)
            {
                if (!String.IsNullOrEmpty(assemblyName))
                {
                    Assembly assembly = Assembly.Load(assemblyName);
                    List<Type> types = assembly
                        .GetTypes()
                        .Where(x => !x.IsInterface && x.Name.Contains(suffix) && !x.IsGenericType)
                        .ToList();
     
                    var result = new Dictionary<Type, Type[]>();
                    foreach (var item in types)
                    {
                        var interfaceType = item.GetInterfaces();
                        result.Add(item, interfaceType);
                    }
                    return result;
                }
                return new Dictionary<Type, Type[]>();
            }

    实际就是载入指定的DLL(根据DLL名字载入),然后过滤出非泛型且符合后缀的实现类(一般仓储,业务都有固定的后缀,可以自己定义命名规则,例如XXXReository,  XXXService等),并且找到实现类所继承的接口(根据我设想,最好是一个接口一个实现,如果遇到一个接口多个实现的地方,尽量自己手工注入,以免引起不必要的误会),进行单元测试,示例如下


     [TestMethod]
            public void BatchDITestMethod()
            {
                var accessImpleAndInterfaces= AssemblyHelper.GetImpleAndInterfaces("DJMS.DataAccess","Access");
                foreach(var v in accessImpleAndInterfaces)
                {
                    Console.WriteLine($"class={v.Key},interface={v.Value[0]},{v.Value.Length}");
                }
                Console.WriteLine($"Access接口及实现个数为:{accessImpleAndInterfaces.Count}");
     
                var logicImpleAndInterfaces = AssemblyHelper.GetImpleAndInterfaces("DJMS.BusinessLogic", "Logic");
                foreach (var v in logicImpleAndInterfaces)
                {
                    Console.WriteLine($"class={v.Key},interface={v.Value[0]},{v.Value.Length}");
                }
                Console.WriteLine($"Logic接口及实现个数为:{accessImpleAndInterfaces.Count}");
            }


    单元测试结果,发现没有问题,都可以找准
    class=DJMS.DataAccess.Repository.DepartmentAccess,interface=DJMS.DataAccess.Repository.IDepartmentAccess,1
    class=DJMS.DataAccess.Repository.ElemeTokenAccess,interface=DJMS.DataAccess.Repository.IElemeTokenAccess,1
    class=DJMS.DataAccess.Repository.MenuAccess,interface=DJMS.DataAccess.Repository.IMenuAccess,1
    class=DJMS.DataAccess.Repository.NewsAccess,interface=DJMS.DataAccess.Repository.INewsAccess,1
    class=DJMS.DataAccess.Repository.NewsTypeAccess,interface=DJMS.DataAccess.Repository.INewsTypeAccess,1
    class=DJMS.DataAccess.Repository.RoleAccess,interface=DJMS.DataAccess.Repository.IRoleAccess,1
    class=DJMS.DataAccess.Repository.RoleMenuAccess,interface=DJMS.DataAccess.Repository.IRoleMenuAccess,1
    class=DJMS.DataAccess.Repository.SMSAccess,interface=DJMS.DataAccess.Repository.ISMSAccess,1
    class=DJMS.DataAccess.Repository.UserAccess,interface=DJMS.DataAccess.Repository.IUserAccess,1
    class=DJMS.DataAccess.Repository.UserRoleAccess,interface=DJMS.DataAccess.Repository.IUserRoleAccess,1
    Access接口及实现个数为:10
    class=DJMS.BusinessLogic.User.UserLogic,interface=DJMS.BusinessLogic.User.IUserLogic,1
    class=DJMS.BusinessLogic.UserRole.UserRoleLogic,interface=DJMS.BusinessLogic.UserRole.IUserRoleLogic,1
    class=DJMS.BusinessLogic.SMS.SMSLogic,interface=DJMS.BusinessLogic.SMS.ISMSLogic,1
    class=DJMS.BusinessLogic.Role.RoleLogic,interface=DJMS.BusinessLogic.Role.IRoleLogic,1
    class=DJMS.BusinessLogic.Photo.PhotoLogic,interface=DJMS.BusinessLogic.Photo.IPhotoLogic,1
    class=DJMS.BusinessLogic.News.NewsLogic,interface=DJMS.BusinessLogic.News.INewsLogic,1
    class=DJMS.BusinessLogic.NewsType.NewsTypeLogic,interface=DJMS.BusinessLogic.NewsType.INewsTypeLogic,1
    class=DJMS.BusinessLogic.Menu.MenuLogic,interface=DJMS.BusinessLogic.Menu.IMenuLogic,1
    class=DJMS.BusinessLogic.Eleme.ElemeLogic,interface=DJMS.BusinessLogic.Eleme.IElemeLogic,1
    class=DJMS.BusinessLogic.Department.DepartmentLogic,interface=DJMS.BusinessLogic.Department.IDepartmentLogic,1
    class=DJMS.BusinessLogic.Base.BaseLogic,interface=DJMS.BusinessLogic.Base.IBaseLogic,1
    Logic接口及实现个数为:10


    然后批量注入并测试,测试一切正常

                //批量接口注入
                var accessImpleAndInterfaces = AssemblyHelper.GetImpleAndInterfaces("DJMS.DataAccess", "Access");
                foreach (var v in accessImpleAndInterfaces)
                    services.AddScoped(v.Value[0], v.Key);
                var logicImpleAndInterfaces = AssemblyHelper.GetImpleAndInterfaces("DJMS.BusinessLogic", "Logic");
                foreach (var v in logicImpleAndInterfaces)

                    services.AddScoped(v.Value[0], v.Key);
  • 相关阅读:
    mysql子查询不支持limit问题解决
    mysql在把子查询结果作为删除表中数据的条件,mysql不允许在子查询的同时删除原表数据
    mysql多表删除指定记录
    px、em、rem、%、vw、vh、vm这些单位的区别
    golang 使用 gRPC
    golang 实现定时任务 cron
    golang 配置文件解析神器--viper
    GO语言异常处理机制
    分析源码理解GO语言文件操作
    用python刷算法--堆排序算法
  • 原文地址:https://www.cnblogs.com/willhuo/p/10800194.html
Copyright © 2011-2022 走看看