StructureMap:如何获得派生消息的基本消息处理程序? (命令处理程序模式)

问题描述:

我有以下信息的层次结构,并希望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来做到这一点?

感谢

你可能将不得不穿越了messageType层次,拨打电话到container.TryGetInstance,直到你得到的处理程序。

仅供参考 - 如果你没有来查找类型层次,StructureMap有语法来支持基于其类型为寻找对象的处理程序的模式:

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