1. 现在有多个服务需要注册到IOC中,传统注册的做法就是有N个服务(不同的注册类型),就得注册N次。
builder.Services.AddScoped<IRabbitMqConnectionFactory, RabbitMqConnectionFactory>();
builder.Services.AddScoped<IOrderService, OrderService>();
2. 创建一个类库MK.Registry.DI
项目结构
1
- 分别定义三个注册类型的接口,IScoped,ISingleton,ITransient.
- 核心=》批量注入服务的扩展类
public static void BatchRegisterService(this IServiceCollection services) { var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory; var assemblys = System.IO.Directory.GetFiles(path, "*.dll").Select(Assembly.LoadFrom).ToArray(); List<Type> typeList = new List<Type>(); foreach (var assembly in assemblys) { var types = assembly.GetTypes(); var list = types.Where(u => u.IsClass && !u.IsAbstract && !u.IsGenericType && (typeof(ITransient).IsAssignableFrom(u) || typeof(IScoped).IsAssignableFrom(u) || typeof(ISingleton).IsAssignableFrom(u))).ToList(); foreach (var type in list) { var interfaceList = type.GetInterfaces(); if (interfaceList.Any()) { var inter = interfaceList.First(); if (typeof(ITransient).IsAssignableFrom(type)) services.AddTransient(inter, type); else if (typeof(IScoped).IsAssignableFrom(type)) services.AddScoped(inter, type); else services.AddSingleton(inter, type); } } } }
3. 在应用项目中引入类库using MK.Registry.DI; 以IScoped为例;
- 实现类中继承IScoped
public class RabbitMqConnectionFactory:IRabbitMqConnectionFactory, IScoped public class OrderService : IOrderService, IScoped - 批量注册继承IScoped的服务
builder.Services.BatchRegisterService();
1352





