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

咱们在使用AddScoped、AddTransient、AddSingleton这类方法的时候非常麻烦。咱们每增长一个接口以及其实现的时候,是否是须要在这里硬编码注册一行代码呢?项目小还好,但当咱们的项目变得庞大以后,这里的依赖注入怎么来维护呢?
在网上翻了半天,看了不少方法,其代码的实现我的感受都不是太优雅,想一想仍是本身写一个比较实用吧,咱们只需按照一个规定来定义和实现接口。应用程序就能自动扫描并注册这些程序集中的接口和对应实现类,完成依赖注入的自动注册,具体的实现能够经过接口或特性来实现,若是须要区分AddScoped、AddTransient、AddSingleton能够经过定义不一样的接口去实现,这里咱们定义IDenpendency接口作演示,具体实现以下: ide

第一步:建立以下这样一个空接口this

public interface IDenpendency { }

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

public interface IUserService:IDenpendency
{
  //function
}

第三步:实现须要注入的功能接口,以下,我建立了一个实现UserService的类spa

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

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

    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方法进行批量注入blog

 

 

 

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

相关文章
相关标签/搜索