• .net core实现批量依赖注入


      最近在做公司老项目升级,要将原有的.net framework程序,升级到.net core平台,这个过程中就发现了一个问题,老项目在调用Service或者是Repository的时候都是直接new出来的,这显然不符合我们.net core的规范,在.net core里边更推荐用依赖注入,这就犯难了,如果我每个Service或者是Repository都在Starpup里面注册,怕是要写个几百行,而且也很繁琐。

      今天上午,想了想要不求助一下大佬 @7thiny ,经过大佬的帮助,写了一个用于全局注册的方法,代码如下:

    public static class InjectHelper
        {
            /// <summary>
            /// Add Scoped from InterfaceAssembly and ImplementAssembly to the specified Microsoft.Extensions.DependencyInjection.IServiceCollection.
            /// </summary>
            /// <param name="services"></param>
            /// <param name="interfaceAssembly"></param>
            /// <param name="implementAssembly"></param>
            public static void AddScoped(this IServiceCollection services, Assembly interfaceAssembly, Assembly implementAssembly)
            {
                var interfaces = interfaceAssembly.GetTypes().Where(t => t.IsInterface);
                var implements = implementAssembly.GetTypes();
                foreach (var item in interfaces)
                {
                    var type = implements.FirstOrDefault(x => item.IsAssignableFrom(x));
                    if (type != null)
                    {
                        services.AddScoped(item, type);
                    }
                }
            }
    
            /// <summary>
            /// Add AddSingleton from InterfaceAssembly and ImplementAssembly to the specified Microsoft.Extensions.DependencyInjection.IServiceCollection.
            /// </summary>
            /// <param name="services"></param>
            /// <param name="interfaceAssembly"></param>
            /// <param name="implementAssembly"></param>
            public static void AddSingleton(this IServiceCollection services, Assembly interfaceAssembly, Assembly implementAssembly)
            {
                var interfaces = interfaceAssembly.GetTypes().Where(t => t.IsInterface);
                var implements = implementAssembly.GetTypes();
                foreach (var item in interfaces)
                {
                    var type = implements.FirstOrDefault(x => item.IsAssignableFrom(x));
                    if (type != null)
                    {
                        services.AddSingleton(item, type);
                    }
                }
            }
    
            /// <summary>
            /// Add AddTransient from InterfaceAssembly and ImplementAssembly to the specified Microsoft.Extensions.DependencyInjection.IServiceCollection.
            /// </summary>
            /// <param name="services"></param>
            /// <param name="interfaceAssembly"></param>
            /// <param name="implementAssembly"></param>
            public static void AddTransient(this IServiceCollection services, Assembly interfaceAssembly, Assembly implementAssembly)
            {
                var interfaces = interfaceAssembly.GetTypes().Where(t => t.IsInterface);
                var implements = implementAssembly.GetTypes();
                foreach (var item in interfaces)
                {
                    var type = implements.FirstOrDefault(x => item.IsAssignableFrom(x));
                    if (type != null)
                    {
                        services.AddTransient(item, type);
                    }
                }
            }
        }

      这样我们就可以通过丢两个Assembly进去,来帮助我们批量注册服务,在Startup中调用方法如下:

                services.AddScoped(Assembly.Load("xxxx.IService"), Assembly.Load("xxxx.Service"));
                services.AddScoped(Assembly.Load("xxxx.IService"), Assembly.Load("xxxx.Service"));
  • 相关阅读:
    Eletron 打开文件夹,截图
    nodejs 与 json
    drupal sql 源码解析query.inc 文件
    The maximum column size is 767 bytes (Mysql)
    php 过滤emoji
    Mysql delete操作
    Mysql update 一个表中自己的数据
    form 表单排序
    jquery parents用法
    MYSQL数据库重点:流程控制语句
  • 原文地址:https://www.cnblogs.com/Yuuuuu/p/12017180.html
Copyright © 2020-2023  润新知