繁体   English   中英

Autofac:实现未注入非泛型接口的泛型类

[英]Autofac: generic class implementing a non generic interface not being injected

说我有以下(简化的)对象模型:

 public abstract class Message { } public class SimpleMessage:Message { } public class ComplexMessage:Message { } public interface IMessageHandler{ void Handle(Message message); } public class NonGenericMessageHandler1: IMessageHandler{ void Handle(Message message){ Console.WriteLine("hi dad!") } } public class NonGenericMessageHandler2: IMessageHandler{ void Handle(Message message){ Console.WriteLine("hi mom!") } } public class GenericMessageHandler<T> :IMessageHandler where T: Message>{ void Handle(Message message){ //do something cool with the generic } } public class MessageHandlerFactory: IMessageHandlerFactory{ public MessageHandlerFactory(IEnumerable<IMessageHandler> handlers){ } public IMessageHandler Create(Message message){ //return the right handler } } 

这是问题所在。 IEnumerable<IMessageHandler>自动注入到MessageHandlerFactory中仅包含IMessageHandler的非通用实现。
如果需要通用版本,则必须手动声明各种封闭版本,如下所示:

  public MessageHandlerFactory(IEnumerable<IMessageHandler> handlers, MessageHandler<SimpleMessage> handler1, MessageHandler<ComplexMessage> handler2){ } 

这是我连接Autofac的方法:

  builder.RegisterAssemblyTypes(typeof (IMessageHandlerFactory).Assembly) .AsImplementedInterfaces() .AsSelf() .SingleInstance(); builder.RegisterGeneric(typeof (MessageHandler<>)).AsSelf().SingleInstance(); 

如何使Autofac传递所有IMessageHandler实现者(包括任何通用变体)的统一集合?

所以我想我明白了。 它归结为鸡或蛋的情况。 当您通过RegisterGeneric方法注册通用类时,Autofac 不会自动注册关闭的类型,除非它在对象图中某处将它们检测为依赖项。

Ctor 1不会触发封闭的泛型被注册:

  public MessageHandlerFactory(IEnumerable<IMessageHandler> handlers){ } 

Ctor 2确实触发了封闭的泛型被注册:

   public MessageHandlerFactory(IEnumerable<IMessageHandler> handlers,
                                MessageHandler<ComplexMessage> complexHandler,
                                MessageHandler<SimpleMessage> simpleHandler
){}

一旦我使用下面的代码手动注册了封闭的泛型,Autofac就开始将它们作为Ctor 1上IEnumerable<IMessageHandler>依赖项的一部分进行注入。

builder.RegisterType(typeof(MessageHandler<ComplexMessage>)).AsImplementedInterfaces();

builder.RegisterType(typeof(MessageHandler<SimpleMessage>)).AsImplementedInterfaces();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM