【发布时间】:2015-01-12 09:42:36
【问题描述】:
所以我有一个名为 IMessage 的标记接口。然后我有如下类:
public class MessageA: IMessage
{
}
然后我将消息处理程序定义为:
internal interface IMessageHandler<in T> where T: IMessage
{
void Handle(T message);
}
public class MessageAHandler : IMessageHandler<MessageA>
{
public void Handle(T message)
{
//Some logic here
}
}
我想在收到新消息时将收到的这些消息重新路由到相应的消息处理程序。示例:
public class MessageReceiver
{
public void ReceiveMessage(IMessage message)
{
//somehow resolve the appropiate message handler here
messageHandler.Handle(message);
}
}
我现在可以通过使用如下工厂来完成此任务,但我需要根据不同类型的消息依赖于每个新工厂。所以我想知道是否有一种方法可以创建一个足够聪明的工厂来解析适当的消息处理程序?
public class MessageReceiver
{
private readonly Func<IMessageHandler<MessageA>> _messageAFactory;
public MessageReceiver(Func<IMessageHandler<MessageA>> messageAFactory)
{
_messageAFactory= messageAFactory;
}
public void ReceiveMessage(IMessage message)
{
if (message is MessageA)
{
var messageHandler = _messageAFactory();
messageHandler.Handle(message as MessageA);
}
// Add more if-statements here for more messages
}
}
Autofac 注册
public class InfrastructureModule : Module
{
protected override void Load(ContainerBuilder builder)
{
//Register the types in the infrastructure assembly
builder.RegisterAssemblyTypes(ThisAssembly).AsImplementedInterfaces()
.InstancePerLifetimeScope();
//Register the message handlers
builder.RegisterAssemblyTypes(ThisAssembly)
.Where(x => x.IsAssignableFrom(typeof(IMessageHandler<IMessage>)))
.InstancePerDependency().AsImplementedInterfaces();
}
}
【问题讨论】:
-
如果我理解正确,您的每条消息都有工厂吗?您也许可以使用 IIndex
(docs.autofac.org/en/latest/advanced/keyed-services.html) -
另外,这可能会有所帮助:stackoverflow.com/questions/25003048/…
-
是的,我每个消息处理程序都有一个工厂(每个消息类型有一个消息处理程序)。感谢您的链接。
标签: c# dependency-injection autofac