在不创建对象的情况下解析类型这是我的问题:我有一个容器,我将具体类型注册为接口。builder.RegisterType().As();我正在为我正在处理的序列化项目实现一个SerializationBinder,我需要实现的BindToType方法要求我返回一个Type对象。BindToType方法为我提供了一个assemblyName和typeName(两个字符串)来帮助我创建一个类型对象。我想做的是,如果typeName是一个接口,我想问Autofac这个Type接口Type的具体实现Type是什么,而不用实际创建对象。那可能吗?如果您使用RegisterType注册您的服务,这是可能的。我写了一个快速测试,可以帮助您提取所需的数据。私有接口IDeleteOrganization{}私有类DeleteOrganization:IDeleteOrganization{}[测试方法]publicvoidCanResolveConcreteType(){varbuilder=newContainerBuilder();builder.RegisterType().As();using(varcontainer=builder.Build()){varregistration=container.ComponentRegistry.RegistrationsFor(newTypedService(typeof(IDeleteOrganization))).SingleOrDefault();if(registration!=null){varactivator=registration.ActivatorasReflectionActivator;if(activator!=null){//我们可以得到类型vartype=activator.LimitType;Assert.AreEqual(type,typeof(DeleteOrganization));您可以很好地包装@Danielg的方法,这样您就可以让Autofac将类型列表注入构造函数。它要求您实现IRegistrationSource。在我的例子中,我想获取所有从IConsoleCommand派生的注册类型:publicHelp(TypeListcommands){_commands=commands;我使用了一个简单的DTO-List来承载类型和T我想解析它们:publicclassTypeList:List{publicTypeList(IEnumerabletypes):base(types){}}实际注册源实现如下,其中typesfromTypeList用于匹配我们要检索的已注册和接口。内部类TypeListSource:IRegistrationSource{publicIEnumerableRegistrationsFor(Serviceservice,Func>registrationAccessor){if(serviceisIServiceWithTypeswt&&typeof(TypeList).IsAssignableFrom(swt.ServiceType)){varregistration=newComponentRegistration(id:Guid.NewGuid(),激活器:newDelegateActivator(swt.ServiceType,(context,p)=>{vartypes=context.ComponentRegistry.RegistrationsFor(newTypedService(typeof(T))).Select(r=>r.Activator).OfType().Select(activator=>activator.LimitType);returnnewTypeList(types);}),services:new[]{service},lifetime:newCurrentScopeLifetime(),sharing:InstanceSharing.None,ownership:InstanceOwnership.OwnedByLifetimeScope,元数据:新字典());返回新的IComponentRegistration[]{注册};}//这不是对基本处理程序类型的请求,因此请跳过它。else{返回Enumerable.Empty();}}publicboolIsAdapterForIndividualComponents=>false;}最后,您它必须添加到构建器中:builder.RegisterSource(newTypeListSource());现在,Autofac可以通过依赖注入来解析类型了,要用了,需要多了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
