我正在尝试在我的一个.NET应用程序中使用StructureMap IOC容器。
我有一系列IMessageHandler实现,它根据从服务收到的消息执行某些操作。每个实现都可能具有各种依赖关系。
目前,我在收到邮件时正在创建这些处理程序的新实例。
public Task HandleMessage(QueueMessage message)
{
if (!messageHandlerMap.ContainsKey(message.GetType()))
{
throw new Exception("No message handler was found for message type: " + message.GetType().ToString());
}
Type messageHandlerType = messageHandlerMap[message.GetType()];
IMessageHandler messageHandler = (IMessageHandler)Activator.CreateInstance(messageHandlerType);
return messageHandler.HandleMessage(message);
}
由于这是在本地方法中发生的,我如何使用StructureMap为这些消息处理程序提供依赖关系?我是否需要注入容器并让它创建消息处理程序?
答案 0 :(得分:0)
我做了Yacoub在上面的评论中提到的应该做的事情。
public class MessageHandlerResolver : IMessageHandlerResolver
{
private IEnumerable<IMessageHandler> handlers;
public MessageHandlerResolver(IEnumerable<IMessageHandler> handlers)
{
this.handlers = handlers;
}
public IMessageHandler Resolve(Type type)
{
IMessageHandler handler = handlers.FirstOrDefault(h => h.MessageType == type);
if(handler == null)
{
throw new ArgumentException("No handler found for message type " + type.ToString(), "type");
}
return handler;
}
}
然后,您可以在IOC容器中配置消息处理程序,并使用列表注入将其注入此处