温莎城堡类型工厂关闭打开通用
本文关键字:城堡 类型 工厂 | 更新日期: 2023-09-27 17:54:33
我不确定这是否可能,但我们想做以下操作
我们有处理消息类型的Processors。每个消息都有一个MessageOrigin。处理器需要基于MessageOrigin的不同映射器。处理器对MessageOrigin不感兴趣。
这给了我们以下代码(这里是完整的要点)
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在容器中注册类型时仍然打开。我该如何解决这个问题?
从我在你的要点中看到的,你没有一个ProcessorImp
的实现,它指定了它的通用类型。这当然就是工厂不能解析IProcessor
的原因:您试图解析服务IProcessor<MessageImpl, MessageOriginImp>
,但您已注册的组件实现了
IProcessor<Message, TMessageOrigin>
where TMessageOrigin : IMessageOrigin
也许你应该重新考虑注册/解析服务的方式;你的MessageOriginImpl
可以有一个接口IIsOriginFor<MessageImpl>
,工厂将根据MessageImpl