侧边栏壁纸
  • 累计撰写 41 篇文章
  • 累计创建 48 个标签
  • 累计收到 2 条评论

.net core 实现自动注入依赖关系

小周黎
2020-04-01 / 0 评论 / 0 点赞 / 237 阅读 / 1,501 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-04-01,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

试想一下,我们每增加一个接口以及其实现的时候,是不是需要在这里硬编码注册一行代码呢?项目小还好,但当我们的项目变得庞大之后,这里的依赖注入怎么来维护呢?

人是会思考的动物,特别是程序猿!!!

这时,我们就要想办法了,想一下有没有一劳永逸的办法,即有没有办法实现依赖注入的动态注册,不管接口及实现怎么变化,我们只需按照一个规定来定义和实现接口。应用程序就能自动扫描并注册这些程序集中的接口和对应实现类,完成依赖注入的自动注册呢?

namespace DInjectionProvider
{
    public static class AutomaticInjection
    {
        public static void ResolveAllTypes(this IServiceCollection services, params string[] projectSuffixes)
        {
            //projectSuffixes 需要扫描的项目名称集合
            //注意: 如果使用此方法,必须提供需要扫描的项目名称
            var allAssemblies = new List<Assembly>();
            var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            foreach (var dll in Directory.GetFiles(path, "*.dll"))
            {
                allAssemblies.Add(Assembly.LoadFile(dll));
            }
            var implementTypes = new List<Type>();
            var assemblyList = allAssemblies.Where(t => projectSuffixes.Any(m => t.FullName.Contains(m))).ToList();
            foreach (var assembly in assemblyList)
            {
                //找到程序集所有接口
                implementTypes.AddRange(assembly.DefinedTypes.Where(t => t.IsClass).ToList());
            }
            foreach (var implementType in implementTypes)
            {
                //接口和实现的命名规则为:"AService"类实现了"IAService"接口,你也可以自定义规则
                var interfaceType = implementType.GetInterface("I" + implementType.Name);
                if (interfaceType != null && !interfaceType.IsGenericType)
                {
                    services.AddSingleton(interfaceType, implementType);
                }
            }
            services.AddSingleton(typeof(IBaseDAL<>), typeof(BaseDAL<>));
            services.AddSingleton(typeof(IBaseBLL<>), typeof(BaseBLL<>));
            //注意这里:上面两行代码是.net core 正常配置代码(为什么这里使用了反射自动配置还要加入此代码,我在这里解释一下,因为上面两个是泛型类和泛型接口,我也不知道为什么这里用反射配置泛型的时候会报错,暂时没找到解决办法,所以这里采用一个傻的办法 就是手写一遍这两个的依赖注入关系)
        }
    }
}
0

评论区