1. 首页>
  2. 技术文章>
  3. asp.net core实现自动注入

asp.net core实现自动注入

7/9/18 11:02:09 PM 浏览 1420 评论 0

asp.net core 自动注入

在Asp.net core中,使用反射加载程序集,手动挺扫描所有的服务依赖,然后将这个服务依赖添加到服务容器中,具体实现代码如下:

namespace MyCore.Infrastructure.Dependency
{
    public static class Ioc
    {
        public static void ResolveAllTypes(this IServiceCollection services, string solutionPrefix, params string[] projectSuffixes)
        {
            //solutionPrefix 解决方案名称
            //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 types = new List<Type>();
            foreach (var assembly in allAssemblies)
            {
                if (assembly.FullName.StartsWith(solutionPrefix))
                {
                    foreach (var assemblyDefinedType in assembly.DefinedTypes)
                    {
                        if (projectSuffixes.Any(x => assemblyDefinedType.Name.EndsWith(x)))
                        {
                            types.Add(assemblyDefinedType.AsType());
                        }
                    }
                }
            }
            var implementTypes = types.Where(x => x.IsClass).ToList();
            foreach (var implementType in implementTypes)
            {
                //接口和实现的命名规则为:"AService"类实现了"IAService"接口,你也可以自定义规则
                var interfaceType = implementType.GetInterface("I" + implementType.Name);
                if (interfaceType != null)
                {
                    services.Add(new ServiceDescriptor(interfaceType, implementType,ServiceLifetime.Scoped));
                }
            }
        }
    }
}

在startup.cs中的ConfigureServices中,使用:

Ioc.ResolveAllTypes(services, "MyCore", "Repository", "Service")

网友讨论