• 在ASP.NET Core中实现自动注入、批量注入


    我们在使用AddScoped、AddTransient、AddSingleton这类方法的时候很是麻烦。我们每增加一个接口以及其实现的时候,是不是需要在这里硬编码注册一行代码呢?项目小还好,但当我们的项目变得庞大之后,这里的依赖注入怎么来维护呢?
    在网上翻了半天,看了很多方法,其代码的实现个人感觉都不是太优雅,想想还是自己写一个比较实用吧,我们只需按照一个规定来定义和实现接口。应用程序就能自动扫描并注册这些程序集中的接口和对应实现类,完成依赖注入的自动注册,具体的实现可以通过接口或特性来实现,如果需要区分AddScoped、AddTransient、AddSingleton可以通过定义不同的接口去实现,这里我们定义IDenpendency接口做演示,具体实现如下: 

    第一步:创建如下这样一个空接口

    public interface IDenpendency { }

    第二步:创建需要注入的功能接口,这类接口就是你想实现某些功能的封装,它们都继承第一步创建的接口IDenpendency,如下,我创建一个功能接口

    public interface IUserService:IDenpendency
    {
      //function
    }

    第三步:实现需要注入的功能接口,如下,我创建了一个实现UserService的类

    public class UserService:IUserService 
    {
      //function的具体实现
    }

     第四步:扩展IServiceCollection批量注入方法AddDataService

        public static class DataServiceExtension
        {
            /// <summary>
            /// 注入数据
            /// </summary>
            /// <param name="services"></param>
            public static IServiceCollection AddDataService(this IServiceCollection services)
            {
                #region 依赖注入
                //services.AddScoped<IUserService, UserService>();
                var baseType = typeof(IDependency);
                var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
                var referencedAssemblies = System.IO.Directory.GetFiles(path, "*.dll").Select(Assembly.LoadFrom).ToArray();
                var types = referencedAssemblies
                    .SelectMany(a => a.DefinedTypes)
                    .Select(type => type.AsType())
                    .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray();
                var implementTypes = types.Where(x => x.IsClass).ToArray();
                var interfaceTypes = types.Where(x => x.IsInterface).ToArray();
                foreach (var implementType in implementTypes)
                {
                    var interfaceType = interfaceTypes.FirstOrDefault(x => x.IsAssignableFrom(implementType));
                    if (interfaceType != null)
                        services.AddScoped(interfaceType, implementType);
                }
                
                #endregion
    
                return services;
            }
        }
    View Code

    第五步:在Startup.cs调用AddDataService方法进行批量注入

     本人原创文章,非商业用途可随意转载,转载请保留原文出处 

  • 相关阅读:
    WC2020「Illusory」
    WC2015-2019
    Java基础——数组
    Java基础——Java基础语法和使用
    完善README——MarkDown模板[EN]
    完善README——MarkDown模板[CN]
    完善README——Markdown语法概要总结
    Java基础——Java如何导入本地项目
    Java基础——Java的历史以及平台应用
    AndroidSDK——和风天气使用初体验
  • 原文地址:https://www.cnblogs.com/hjpms/p/11108915.html
Copyright © 2020-2023  润新知