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

本文关键字:城堡 类型 工厂 | 更新日期: 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

的类型来解决这些问题。