簡體   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