Exemplo n.º 1
0
        public static IServiceCollection RegisterAssembly(this IServiceCollection services)
        {
            var assemblys = RuntimeHelper.GetAllAssemblies();

            foreach (var item in assemblys)
            {
                RegisterAssembly(services, item);
            }

            return(services);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 用DI批量注入接口程序集中对应的实现类。
        /// </summary>
        /// <param name="service"></param>
        /// <param name="interfaceAssemblyName">接口程序集的名称(不包含文件扩展名)</param>
        /// <param name="implementAssemblyName">实现程序集的名称(不包含文件扩展名)</param>
        /// <returns></returns>
        public static IServiceCollection RegisterAssembly(IServiceCollection service, string interfaceAssemblyName, string implementAssemblyName)
        {
            if (service == null)
            {
                throw new ArgumentNullException(nameof(service));
            }
            if (string.IsNullOrEmpty(interfaceAssemblyName))
            {
                throw new ArgumentNullException(nameof(interfaceAssemblyName));
            }
            if (string.IsNullOrEmpty(implementAssemblyName))
            {
                throw new ArgumentNullException(nameof(implementAssemblyName));
            }

            var interfaceAssembly = RuntimeHelper.GetAssembly(interfaceAssemblyName);

            if (interfaceAssembly == null)
            {
                throw new DllNotFoundException($"the dll \"{interfaceAssemblyName}\" not be found");
            }

            var implementAssembly = RuntimeHelper.GetAssembly(implementAssemblyName);

            if (implementAssembly == null)
            {
                throw new DllNotFoundException($"the dll \"{implementAssemblyName}\" not be found");
            }

            //过滤掉非接口及泛型接口
            var types = interfaceAssembly.GetTypes().Where(t => t.GetTypeInfo().IsInterface&& !t.GetTypeInfo().IsGenericType);

            foreach (var type in types)
            {
                //过滤掉抽象类、泛型类以及非class
                var implementType = implementAssembly.DefinedTypes
                                    .FirstOrDefault(t => t.IsClass && !t.IsAbstract && !t.IsGenericType &&
                                                    t.GetInterfaces().Any(b => b.Name == type.Name));
                if (implementType != null)
                {
                    service.AddScoped(type, implementType.AsType());
                }
            }

            return(service);
        }
Exemplo n.º 3
0
        /// <summary>
        /// 用DI批量注入接口程序集中对应的实现类。
        /// </summary>
        /// <param name="service"></param>
        /// <param name="interfaceAssemblyName"></param>
        /// <returns></returns>
        public static IServiceCollection RegisterAssembly(IServiceCollection service, Assembly assembly)
        {
            if (service == null)
            {
                throw new ArgumentNullException(nameof(service));
            }
            if (assembly == null)
            {
                throw new DllNotFoundException($"the dll  not be found");
            }

            //过滤掉非接口及泛型接口
            var types = assembly.GetTypes().Where(t => t.GetTypeInfo().IsInterface&& !t.GetTypeInfo().IsGenericType);

            foreach (var type in types)
            {
                var implementTypeName = type.Name.Substring(1);
                var implementType     = RuntimeHelper.GetImplementType(implementTypeName, type);
                if (implementType != null)
                {
                    service.AddScoped(type, implementType);
                }
            }

            //增加dto验证类的注入
            var validtorTypes = assembly.GetTypes().Where(a => a.GetTypeInfo().GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IValidator <>)));

            if (validtorTypes != null && validtorTypes.Count() > 0)
            {
                foreach (var type in validtorTypes)
                {
                    Type validInterface = typeof(IValidator <>);
                    Type constructed    = validInterface.MakeGenericType(type);
                    service.AddTransient(constructed, type);
                }
            }

            return(service);
        }