.net core 实现自动注入依赖关系
试想一下,我们每增加一个接口以及其实现的时候,是不是需要在这里硬编码注册一行代码呢?项目小还好,但当我们的项目变得庞大之后,这里的依赖注入怎么来维护呢?
人是会思考的动物,特别是程序猿!!!
这时,我们就要想办法了,想一下有没有一劳永逸的办法,即有没有办法实现依赖注入的动态注册,不管接口及实现怎么变化,我们只需按照一个规定来定义和实现接口。应用程序就能自动扫描并注册这些程序集中的接口和对应实现类,完成依赖注入的自动注册呢?
namespace DInjectionProvider
{
public static class AutomaticInjection
{
public static void ResolveAllTypes(this IServiceCollection services, params string[] projectSuffixes)
{
//projectSuffixes 需要扫描的项目名称集合
//注意: 如果使用此方法,必须提供需要扫描的项目名称
var allAssemblies = new List<Assembly>();
var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
foreach (var dll in Directory.GetFiles(path, "*.dll"))
{
allAssemblies.Add(Assembly.LoadFile(dll));
}
var implementTypes = new List<Type>();
var assemblyList = allAssemblies.Where(t => projectSuffixes.Any(m => t.FullName.Contains(m))).ToList();
foreach (var assembly in assemblyList)
{
//找到程序集所有接口
implementTypes.AddRange(assembly.DefinedTypes.Where(t => t.IsClass).ToList());
}
foreach (var implementType in implementTypes)
{
//接口和实现的命名规则为:"AService"类实现了"IAService"接口,你也可以自定义规则
var interfaceType = implementType.GetInterface("I" + implementType.Name);
if (interfaceType != null && !interfaceType.IsGenericType)
{
services.AddSingleton(interfaceType, implementType);
}
}
services.AddSingleton(typeof(IBaseDAL<>), typeof(BaseDAL<>));
services.AddSingleton(typeof(IBaseBLL<>), typeof(BaseBLL<>));
//注意这里:上面两行代码是.net core 正常配置代码(为什么这里使用了反射自动配置还要加入此代码,我在这里解释一下,因为上面两个是泛型类和泛型接口,我也不知道为什么这里用反射配置泛型的时候会报错,暂时没找到解决办法,所以这里采用一个傻的办法 就是手写一遍这两个的依赖注入关系)
}
}
}