我正在使用 Autofac,并且希望有一个接口的多个实现。如何配置 Autofac 以便根据当前类型解决依赖关系?
更具体地说,我有一个接口和多个应该链接在一起的实现。
让我解释一下(虚构的类):
public interface IMessageHandler
{
void Handle(Message message);
}
public class LoggingMessageHandler : IMessageHandler
{
private IMessageHandler _messageHandler;
public LoggingMessageHandler(IMessageHandler messageHandler)
{
_messageHandler = messageHandler;
}
public void Handle(Message message)
{
// log something
_messageHandler.Handle(message);
}
}
public class DoSomethingMessageHandler : IMessageHandler
{
private IMessageHandler _messageHandler;
public DoSomethingMessageHandler (IMessageHandler messageHandler)
{
_messageHandler = messageHandler;
}
public void Handle(Message message)
{
// do something
_messageHandler.Handle(message);
}
}
链的底部可能是IMessageHandler
这不会将消息传递给下一个。
如果我想要以下链:
TopLevelClass -> LoggingMessageHandler -> DoSomethingMessageHandler -> FinalHandler
我如何告诉 Autofac
- pass
LoggingMessageHandler
to TopLevelClass
(以满足其对IMessageHandler
)
- pass
DoSomethingMessageHandler
to LoggingMessageHandler
(以满足其对IMessageHandler
)
- pass
LoggingMessageHandler
to FinalHandler
(以满足其对IMessageHandler
)
是否有可能(我读过有关对 IEnumerable 的隐式支持 https://code.google.com/p/autofac/wiki/RelationshipTypes#Example%3a_Implicit_IEnumerable_Support)?或者我必须在两者之间使用额外的类(工厂或其他东西)?
Autofac 默认隐式支持此功能 https://docs.autofac.org/en/latest/resolve/relationships.html#enumeration-ienumerable-b-ilist-b-icollection-b通过使用IEnumerable<T> https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1。而不是让依赖类的构造函数接受单个实例T
,你让它在一个实例中IEnumerable<T>
这将包含每一个T
挂号的:
public interface IMessageHandler
{
void HandleMessage(Message m);
}
public class MessageProcessor
{
private IEnumerable<IMessageHandler> _handlers;
public MessageProcessor(IEnumerable<IMessageHandler> handlers)
{
_handlers = handlers;
}
public void ProcessMessage(Message m)
{
foreach (var handler in _handlers)
{
handler.HandleMessage(m);
}
}
}
然后在您的注册中,只需添加多个实现T
:
var builder = new ContainerBuilder();
builder.RegisterType<FirstHandler>().As<IMessageHandler>();
builder.RegisterType<SecondHandler>().As<IMessageHandler>();
builder.RegisterType<ThirdHandler>().As<IMessageHandler>();
builder.RegisterType<MessageProcessor>();
When MessageProcessor
被实例化后,IEnumerable
根据上述注册,它收到的将包含三个项目IMessageHandler
.
您可以在我的博客上阅读更多相关内容。 http://www.whoiskevinrich.com/using-dependency-injection-for-implementation-enumeration
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)