最近在做公司老项目升级,要将原有的.net framework程序,升级到.net core平台,这个过程中就发现了一个问题,老项目在调用Service或者是Repository的时候都是直接new出来的,这显然不符合我们.net core的规范,在.net core里边更推荐用依赖注入,这就犯难了,如果我每个Service或者是Repository都在Starpup里面注册,怕是要写个几百行,而且也很繁琐。
今天上午,想了想要不求助一下大佬 @7thiny ,经过大佬的帮助,写了一个用于全局注册的方法,代码如下:
public static class InjectHelper { /// <summary> /// Add Scoped from InterfaceAssembly and ImplementAssembly to the specified Microsoft.Extensions.DependencyInjection.IServiceCollection. /// </summary> /// <param name="services"></param> /// <param name="interfaceAssembly"></param> /// <param name="implementAssembly"></param> public static void AddScoped(this IServiceCollection services, Assembly interfaceAssembly, Assembly implementAssembly) { var interfaces = interfaceAssembly.GetTypes().Where(t => t.IsInterface); var implements = implementAssembly.GetTypes(); foreach (var item in interfaces) { var type = implements.FirstOrDefault(x => item.IsAssignableFrom(x)); if (type != null) { services.AddScoped(item, type); } } } /// <summary> /// Add AddSingleton from InterfaceAssembly and ImplementAssembly to the specified Microsoft.Extensions.DependencyInjection.IServiceCollection. /// </summary> /// <param name="services"></param> /// <param name="interfaceAssembly"></param> /// <param name="implementAssembly"></param> public static void AddSingleton(this IServiceCollection services, Assembly interfaceAssembly, Assembly implementAssembly) { var interfaces = interfaceAssembly.GetTypes().Where(t => t.IsInterface); var implements = implementAssembly.GetTypes(); foreach (var item in interfaces) { var type = implements.FirstOrDefault(x => item.IsAssignableFrom(x)); if (type != null) { services.AddSingleton(item, type); } } } /// <summary> /// Add AddTransient from InterfaceAssembly and ImplementAssembly to the specified Microsoft.Extensions.DependencyInjection.IServiceCollection. /// </summary> /// <param name="services"></param> /// <param name="interfaceAssembly"></param> /// <param name="implementAssembly"></param> public static void AddTransient(this IServiceCollection services, Assembly interfaceAssembly, Assembly implementAssembly) { var interfaces = interfaceAssembly.GetTypes().Where(t => t.IsInterface); var implements = implementAssembly.GetTypes(); foreach (var item in interfaces) { var type = implements.FirstOrDefault(x => item.IsAssignableFrom(x)); if (type != null) { services.AddTransient(item, type); } } } }
这样我们就可以通过丢两个Assembly进去,来帮助我们批量注册服务,在Startup中调用方法如下:
services.AddScoped(Assembly.Load("xxxx.IService"), Assembly.Load("xxxx.Service")); services.AddScoped(Assembly.Load("xxxx.IService"), Assembly.Load("xxxx.Service"));