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

时间:2011-12-14 02:09:48

标签: .net inversion-of-control structuremap

我有以下消息层次结构,并希望StructureMap返回相应的消息处理程序,如下所示(注意:一个处理程序适用于从YMessageBase派生的所有消息):

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提供一些建议吗?

由于

1 个答案:

答案 0 :(得分:2)

您可能必须遍历messageType层次结构,在获得处理程序之前调用container.TryGetInstance

仅供参考 - 如果您不必查找类型层次结构,StructureMap具有支持根据类型查找对象处理程序的模式的语法:

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