• .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"));
  • 相关阅读:
    poj3625
    Directx10,11的SwapChain,RenderTarget和DepthBuffer解释
    Everything you need to know about Authenticode Code Signing
    Best Render Settings for After Effects CS5
    javascript 中cookie的存储,获取cookie,删除cookie的方法
    白话数字签名(番外篇)——签名EXE文件(下)
    在php中使用CKEDITOR在线编辑器
    HTML5 VIDEO标签播放事件流水
    白话数字签名(番外篇)——签名EXE文件(上)
    自定义hint框
  • 原文地址:https://www.cnblogs.com/Yuuuuu/p/12017180.html
Copyright © 2020-2023  润新知