试想一下,我们每增加一个接口以及其实现的时候,是不是需要在这里硬编码注册一行代码呢?项目小还好,但当我们的项目变得庞大之后,这里的依赖注入怎么来维护呢?
人是会思考的动物,特别是程序猿!!!
这时,我们就要想办法了,想一下有没有一劳永逸的办法,即有没有办法实现依赖注入的动态注册,不管接口及实现怎么变化,我们只需按照一个规定来定义和实现接口。应用程序就能自动扫描并注册这些程序集中的接口和对应实现类,完成依赖注入的自动注册呢?
namespaceDInjectionProvider{publicstaticclassAutomaticInjection{publicstaticvoidResolveAllTypes(thisIServiceCollection services,paramsstring[] projectSuffixes){//projectSuffixes 需要扫描的项目名称集合//注意: 如果使用此方法,必须提供需要扫描的项目名称varallAssemblies =newList();varpath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);foreach(vardllinDirectory.GetFiles(path,"*.dll")) { allAssemblies.Add(Assembly.LoadFile(dll)); }varimplementTypes =newList();varassemblyList = allAssemblies.Where(t => projectSuffixes.Any(m => t.FullName.Contains(m))).ToList();foreach(varassemblyinassemblyList) {//找到程序集所有接口implementTypes.AddRange(assembly.DefinedTypes.Where(t => t.IsClass).ToList()); }foreach(varimplementTypeinimplementTypes) {//接口和实现的命名规则为:"AService"类实现了"IAService"接口,你也可以自定义规则varinterfaceType = 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 正常配置代码(为什么这里使用了反射自动配置还要加入此代码,我在这里解释一下,因为上面两个是泛型类和泛型接口,我也不知道为什么这里用反射配置泛型的时候会报错,暂时没找到解决办法,所以这里采用一个傻的办法 就是手写一遍这两个的依赖注入关系)} }}
网友评论