依赖注入:在功能上解决

时间:2016-05-24 17:49:58

标签: .net dependency-injection

我正在尝试在我的一个.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为这些消息处理程序提供依赖关系?我是否需要注入容器并让它创建消息处理程序?

1 个答案:

答案 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容器中配置消息处理程序,并使用列表注入将其注入此处