城堡温莎类型工厂关闭开放通用

时间:2014-03-27 14:04:44

标签: c# generics dependency-injection castle-windsor

我不确定这是否可行,但我们想要执行以下操作

我们有处理一种Message的处理器。每条消息都有一个MessageOrigin。处理器需要基于MessageOrigin的不同Mappers。处理器对MessageOrigin不感兴趣。

这为我们提供了以下代码(完整的Gist here

public class ConcreteMessageProcessor<TMessageOrigin> 
    : IProcessor<ConcreteMessage, TMessageOrigin>
{
    public ConcreteMessageProcessor(IMapper<TMessageOrigin> mapper){}
}

我们还有一个TypedFactory来创建处理器:

public interface IProcessorFactory
{
    IProcessor[] GetAllProcessorsForMessage(Message message, 
        IMessageOrigin origin);
}

与选择器结合使用:

public class ProcessorSelector : DefaultTypedFactoryComponentSelector
{
    protected override Type GetComponentType(MethodInfo method, 
        object[] arguments)
    {
        return typeof(IProcessor<,>).MakeGenericType(arguments[0].GetType(),
            arguments[1].GetType()).MakeArrayType();
    }
}

但是,当我们调用IProcessorFactory时,我们永远不会得到处理器。我想这是因为TMessageOrigin在容器中注册类型时仍然打开。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

从我在你的要点中看到的,你没有ProcessorImp的实现,它指定了它的泛型类型。这肯定是工厂无法解决IProcessor的原因:您尝试解析服务IProcessor<MessageImpl, MessageOriginImp>,但您注册的组件已实现

IProcessor<Message, TMessageOrigin>
where TMessageOrigin : IMessageOrigin

也许您应该重新考虑尝试注册/解决服务的方式;您的MessageOriginImpl可以有一个界面IIsOriginFor<MessageImpl>,工厂会根据MessageImpl

的类型解决这些问题