簡體   English   中英

溫莎城堡類型的工廠關閉常開

[英]Castle Windsor Typed Factory Close Open Generic

我不確定是否可行,但我們要執行以下操作

我們有處理一種消息的處理器。 每個消息都有一個MessageOrigin。 處理器需要基於MessageOrigin的不同映射器。 處理器對MessageOrigin不感興趣。

這為我們提供了以下代碼( 此處完整Gist)

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的類型來解析這些接口

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM