2014-03-27 39 views
1

我不知道這是可能的,但我們要做到以下幾點城堡溫莎類型化廠關閉打開通用

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

這給了我們下面的代碼(全要點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時,我們永遠不會得到一個pr ocessor。我猜這是因爲TMessageOrigin在類型註冊到容器時仍然打開。我該如何解決這個問題?

回答

2

從我在你的要點看到的你沒有實現一個ProcessorImp,它指定了它的泛型類型。這肯定爲什麼工廠無法解決IProcessor的理由:你想解決服務IProcessor<MessageImpl, MessageOriginImp>但你已經註冊工具

IProcessor<Message, TMessageOrigin> 
where TMessageOrigin : IMessageOrigin 

也許你應該重新考慮你嘗試註冊/解決您的服務的方式成分;您MessageOriginImpl可以有一個接口IIsOriginFor<MessageImpl>,工廠會根據對MessageImpl

+0

我知道有註冊的確切通用的足跡沒有處理器類型解決這些問題,但我不知道是否城堡可能關閉最後打開的通用使用我的參數在選擇器中。 – Lodewijk

+0

我不認爲Castle可以關閉這個待定的通用值,並且您必須在工廠明確地解決它。這就是爲什麼我建議重新考慮你註冊/解決服務的方式。如果你只有一個消息的MessageOrigin,那麼你就不需要IP處理器來了解MessageOrigin,因爲它可以從消息中解析出來。如果每條消息有很多MessageOrigin,那麼您必須選擇系統必須如何解決並處理它們。 – samy

+0

我們每個消息有多個來源。我們已經對系統進行了重新思考,但我認爲可能有辦法在Castle中關閉泛型,不過涉及'IGenericImplementationMatchingStrategy' – Lodewijk