[英]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.