无需创建对象即可解析类型

这是我的问题:我有一个容器,我将具体类型注册为接口。

builder.RegisterType().As(); 

我正在为我正在进行的序列化项目实现SerializationBinder ,我需要实现的BindToType方法要求我返回一个Type对象。 BindToType方法为我提供了一个assemblyNametypeName (两个字符串)来帮助我创建一个类型对象。 我想要做的是,如果typeName是一个接口,我想问一下Autofac具体的实现Type是什么Type接口Type而不实际创建对象。 那可能吗?

如果您使用RegisterType注册您的服务,这是可能的。 我写了一个快速测试,可以帮助您提取所需的数据。

 private interface IDeleteOrganization { } private class DeleteOrganization : IDeleteOrganization { } [TestMethod] public void CanResolveConcreteType() { var builder = new ContainerBuilder(); builder.RegisterType() .As(); using(var container = builder.Build()) { var registration = container.ComponentRegistry .RegistrationsFor(new TypedService(typeof (IDeleteOrganization))) .SingleOrDefault(); if (registration != null) { var activator = registration.Activator as ReflectionActivator; if (activator != null) { //we can get the type var type = activator.LimitType; Assert.AreEqual(type, typeof (DeleteOrganization)); } } } } 

你可以非常好地封装@Danielg的方法,这样你就可以让Autofac将类型列表注入到construtor中。 它要求您实现IRegistrationSource

在我的情况下,我希望得到从IConsoleCommand派生的所有注册类型:

 public Help(TypeList commands) { _commands = commands; } 

我使用了一个简单的DTO-List来携带我想解决它们的类型和T

 public class TypeList : List { public TypeList(IEnumerable types) : base(types) { } } 

实际的注册源实现如下,其中来自TypeList用于匹配已注册和我们想要检索的接口的类型。

 internal class TypeListSource : IRegistrationSource { public IEnumerable RegistrationsFor(Service service, Func> registrationAccessor) { if (service is IServiceWithType swt && typeof(TypeList).IsAssignableFrom(swt.ServiceType)) { var registration = new ComponentRegistration( id: Guid.NewGuid(), activator: new DelegateActivator(swt.ServiceType, (context, p) => { var types = context .ComponentRegistry .RegistrationsFor(new TypedService(typeof(T))) .Select(r => r.Activator) .OfType() .Select(activator => activator.LimitType); return new TypeList(types); }), services: new[] {service}, lifetime: new CurrentScopeLifetime(), sharing: InstanceSharing.None, ownership: InstanceOwnership.OwnedByLifetimeScope, metadata: new Dictionary() ); return new IComponentRegistration[] {registration}; } // It's not a request for the base handler type, so skip it. else { return Enumerable.Empty(); } } public bool IsAdapterForIndividualComponents => false; } 

最后,您必须将其添加到builder中:

 builder.RegisterSource(new TypeListSource()); 

现在,Autofac可以通过dependency injection来解析类型。