2011-12-14 114 views
1

我有以下信息的層次結構,並希望StructureMap返回我相應的消息處理程序,如下所示(注意:一個處理程序是用於從YMessageBase衍生的所有消息):StructureMap:如何獲得派生消息的基本消息處理程序? (命令處理程序模式)

abstract class XMessageBase { ... } 
class AMessage : XMessageBase { ... } 

abstract class YMessageBase { ... } 
class BMessage: YMessageBase { ... } 

AMessageHandler : AbstractMessageHandler<AMessage> { ... } 
YMessageBaseHandler : AbstractMessageHandler<YMessageBase> { ... } 

我設置StructureMap像這樣:

 Scan(cfg => 
     { 
      cfg.TheCallingAssembly(); 
      cfg.IncludeNamespace("Namespace.With.Above.Types"); 
      cfg.ConnectImplementationsToTypesClosing(typeof(AbstractMessageHandler<>)); 
      cfg.WithDefaultConventions(); 
     }); 

而且我試圖處理的消息是這樣的:

ProcessMessage(object message) 
{ 
    var messageType = message.GetType(); 
    var handlerType = typeof(AbstractMessageHandler<>).MakeGenericType(messageType); 
    var handler = (IMessageHandler)ObjectFactory.Container.GetInstance(handlerType); 
    handler.Handle(message); 
} 

問題是,在BMessage的情況下,此方法在詢問StructureMap的AbstractMessageHandler<BMessage>時確實需要找到AbstractMessageHandler<YMessageBase> ...結果是它沒有找到處理程序。

任何人都可以提供一些建議如何使用StructureMap來做到這一點?

感謝

回答

2

你可能將不得不穿越了messageType層次,撥打電話到container.TryGetInstance,直到你得到的處理程序。

僅供參考 - 如果你沒有來查找類型層次,StructureMap有語法來支持基於其類型爲尋找對象的處理程序的模式:

handler = ObjectFactory.Container.ForObject(message). 
    GetClosedTypeOf(typeof(AbstractMessageHandler<>)). 
    As<IMessageHandler>();