71 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C#
		
	
	
	
using System.Reflection;
 | 
						||
 | 
						||
namespace langguanApi.Extensions.AutoDI
 | 
						||
{
 | 
						||
    /// <summary>
 | 
						||
    /// 自动注入
 | 
						||
    /// </summary>
 | 
						||
    public static class AutoDIExtensions
 | 
						||
    {
 | 
						||
        /// <summary>
 | 
						||
        /// 
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="serviceCollection"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        public static IServiceCollection ServicesAutoInjectionExtension(this IServiceCollection serviceCollection)
 | 
						||
        {
 | 
						||
            var directory = AppDomain.CurrentDomain.BaseDirectory;
 | 
						||
            var types = Directory.GetFiles(directory, "*.dll", SearchOption.TopDirectoryOnly)
 | 
						||
                .Select(Assembly.LoadFrom)
 | 
						||
                .SelectMany(a => a.GetTypes());
 | 
						||
            Injection(serviceCollection, types);
 | 
						||
            return serviceCollection;
 | 
						||
        }
 | 
						||
        /// <summary>
 | 
						||
        /// 服务自动注入
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="serviceCollection">需要自动注入服务的服务集合</param>
 | 
						||
        /// <param name="selector">应用于每个Assembly的筛选函数</param>
 | 
						||
        /// <exception cref="ArgumentOutOfRangeException">指定的注入类型不在可注入的范围内</exception>
 | 
						||
        /// <exception cref="NoImplementationInterfaceException">指定注入的类型未实现任何服务</exception>
 | 
						||
        /// <exception cref="ArgumentException">输入的参数错误:1、注入的类型未实现指定的服务。2、指定的服务不是Interface类型</exception>
 | 
						||
        /// <returns>自动注入服务后的服务集合</returns>
 | 
						||
        public static IServiceCollection ServicesAutoInjection(this IServiceCollection serviceCollection, Func<Assembly, bool> selector)
 | 
						||
        {
 | 
						||
            var directory = AppDomain.CurrentDomain.BaseDirectory;
 | 
						||
            var types = Directory.GetFiles(directory, "*.dll", SearchOption.TopDirectoryOnly)
 | 
						||
                .Select(Assembly.LoadFrom)
 | 
						||
                .Where(selector)
 | 
						||
                .SelectMany(a => a.GetTypes());
 | 
						||
 | 
						||
            Injection(serviceCollection, types);
 | 
						||
 | 
						||
            return serviceCollection;
 | 
						||
        }
 | 
						||
        // 注入逻辑
 | 
						||
        private static void Injection(IServiceCollection serviceCollection, IEnumerable<Type> types)
 | 
						||
        {
 | 
						||
            foreach (var type in types)
 | 
						||
            {
 | 
						||
                var attribute = type.GetCustomAttribute<ServiceInjectionAttribute>();
 | 
						||
                if (attribute == null) continue;
 | 
						||
                switch (attribute.InjectionType)
 | 
						||
                {
 | 
						||
                    case InjectionType.Transient:
 | 
						||
                        serviceCollection.AddTransient(type);
 | 
						||
                        break;
 | 
						||
                    case InjectionType.Scoped:
 | 
						||
                        serviceCollection.AddScoped(type);
 | 
						||
                        break;
 | 
						||
                    case InjectionType.Singleton:
 | 
						||
                        serviceCollection.AddSingleton(type);
 | 
						||
                        break;
 | 
						||
                    default:
 | 
						||
                        throw new ArgumentOutOfRangeException();
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 |