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>();