当前位置: 首页 > 编程语言 > C#

让.NETCoreDI通过通用接口-抽象类实现自动解析类

时间:2023-04-10 16:43:01 C#

让.NETCoreDI通过通用接口/抽象类实现自动解析类.NETCore有没有办法注册通用interfaces,并让它解析一个与实现匹配的类。例如,我有以下接口:publicinterfaceIMapper{}我还有一个抽象类:publicabstractclassMapper:IMapper{protectedMapper(){//somegenericstuff}publicabstractTToMap(TFrom);然后我可以创建一个这样的实现:publicclassUserMapper:Mapper{publicoverrideEntity.UserMap(Domain.Userfrom){//domapping}}有没有办法用默认的.NETCoreDI注册IMapper,让它自动解析类?因此,如果我在代码的某处执行此操作:classSomeClass{publicSomeClass(IMappermapper){}}它是否以某种方式知道它应该解析UserMapper类?原因是手动注册每个映射器有些繁琐且特定于实现。所以我希望Microsoft.DependencyInjection足够聪明,能够以某种方式自动解析它的实现。您当前设计它的唯一方法是使用反射:Assemblyassembly=typeof(UserMapper).Assembly;foreach(vartypeinassembly.GetTypes().Where(t=>t.IsClass&&!t.IsAbstract)){foreach(variintype.GetInterfaces()){if(i.IsGenericType&&i.GetGenericTypeDefinition()==typeof(IMapper)){//注意:由于Microsoft.DependencyInjection的限制,我们不能//在没有开放通用实现类型的情况下//注册一个开放通用接口类型。所以,我们转换成一个封闭的泛型接口//类型来注册。varinterfaceType=typeof(IMapper).MakeGenericType(i.GetGenericArguments());services.AddTransient(接口类型,类型);注意:您可以通过在IServiceCollection上创建扩展方法来添加Transient,其中AddSingleton具有AddTransient、AddSingleton等的各种重载。如果改变设计,请使用非抽象泛型作为实现类型:publicclassMapper:IMapper{//...}然后可以这样注册:自动解析类共享的所有内容,如果是对你有用,需要了解更多C#学习教程,希望大家多多关注—services.AddTransient(typeof(IMapper),typeof(Mapper));代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: