![](/img/trans.png)
[英]Assign generic type class implementing interface to generic type being interface
[英]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.