Ejemplo n.º 1
0
        /// <summary>
        /// 用DI批量注入接口程序集中对应的实现类。
        /// <para>
        /// 需要注意的是,这里有如下约定:
        /// IUserService --> UserService, IUserRepository --> UserRepository.
        /// </para>
        /// </summary>
        /// <param name="service"></param>
        /// <param name="interfaceAssemblyName">接口程序集的名称(不包含文件扩展名)</param>
        /// <returns></returns>
        public static IServiceCollection RegisterAssembly(this IServiceCollection service, string interfaceAssemblyName, Lifecycle lifecycle = Lifecycle.Transient)
        {
            if (service == null)
            {
                throw new ArgumentNullException(nameof(service));
            }
            if (string.IsNullOrEmpty(interfaceAssemblyName))
            {
                throw new ArgumentNullException(nameof(interfaceAssemblyName));
            }

            var assembly = RuntimeHelper.GetAssembly(interfaceAssemblyName);

            if (assembly == null)
            {
                throw new DllNotFoundException($"the dll \"{interfaceAssemblyName}\" 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)
                {
                    switch (lifecycle)
                    {
                    case Lifecycle.Scoped:
                        service.AddScoped(type, implementType);
                        break;

                    case Lifecycle.Transient:
                        service.AddTransient(type, implementType);
                        break;

                    case Lifecycle.Singleton:
                        service.AddSingleton(type, implementType);
                        break;

                    default:
                        service.AddTransient(type, implementType);
                        break;
                    }
                }
            }
            return(service);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 用DI批量注入接口程序集中对应的实现类。
        /// </summary>
        /// <param name="service"></param>
        /// <param name="interfaceAssemblyName">接口程序集的名称(不包含文件扩展名)</param>
        /// <param name="implementAssemblyName">实现程序集的名称(不包含文件扩展名)</param>
        /// <returns></returns>
        public static IServiceCollection RegisterAssembly(this IServiceCollection service, string interfaceAssemblyName, string implementAssemblyName, Lifecycle lifecycle = Lifecycle.Transient)
        {
            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)
                {
                    switch (lifecycle)
                    {
                    case Lifecycle.Scoped:
                        service.AddScoped(type, implementType.AsType());
                        break;

                    case Lifecycle.Transient:
                        service.AddTransient(type, implementType.AsType());
                        break;

                    case Lifecycle.Singleton:
                        service.AddSingleton(type, implementType.AsType());
                        break;

                    default:
                        service.AddTransient(type, implementType.AsType());
                        break;
                    }
                }
            }

            return(service);
        }