我不确定这是否可行,但我们想要执行以下操作
我们有处理一种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在容器中注册类型时仍然打开。我该如何解决这个问题?
答案 0 :(得分:2)
从我在你的要点中看到的,你没有ProcessorImp
的实现,它指定了它的泛型类型。这肯定是工厂无法解决IProcessor
的原因:您尝试解析服务IProcessor<MessageImpl, MessageOriginImp>
,但您注册的组件已实现
IProcessor<Message, TMessageOrigin>
where TMessageOrigin : IMessageOrigin
也许您应该重新考虑尝试注册/解决服务的方式;您的MessageOriginImpl
可以有一个界面IIsOriginFor<MessageImpl>
,工厂会根据MessageImpl