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

.net StructureMap:如何获取派生消息的基本消息处理程序?(命令处理程序模式),.net,inversion-of-control,structuremap,.net,Inversion Of Control,Structuremap,我有以下消息层次结构,并希望StructureMap返回如下所示的相应消息处理程序(注意:一个处理程序用于从YMessageBase派生的所有消息): 抽象类XMessageBase{…} 类AMessage:XMessageBase{…} 抽象类YMessageBase{…} 类BMessage:YMessageBase{…} AMessageHandler:AbstractMessageHandler{…} YMessageBaseHandler:AbstractMessageHandler

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

抽象类XMessageBase{…}
类AMessage:XMessageBase{…}
抽象类YMessageBase{…}
类BMessage:YMessageBase{…}
AMessageHandler:AbstractMessageHandler{…}
YMessageBaseHandler:AbstractMessageHandler{…}
我按如下方式设置StructureMap:

        Scan(cfg =>
        {
            cfg.TheCallingAssembly();
            cfg.IncludeNamespace("Namespace.With.Above.Types");
            cfg.ConnectImplementationsToTypesClosing(typeof(AbstractMessageHandler<>));
            cfg.WithDefaultConventions();
        });
Scan(cfg=>
{
cfg.卡套总成();
IncludeNamespace(“Namespace.With.over.Types”);
连接实现到typesClosing(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);
}
ProcessMessage(对象消息)
{
var messageType=message.GetType();
var handlerType=typeof(AbstractMessageHandler).MakeGenericType(messageType);
var handler=(IMessageHandler)ObjectFactory.Container.GetInstance(handlerType);
handler.Handle(消息);
}
问题在于,在
BMessage
的情况下,这种方法是在真正需要定位
AbstractMessageHandler
时,向StructureMap请求
AbstractMessageHandler
。。。结果是它找不到处理程序

有人能给我一些关于如何使用StructureMap的建议吗


谢谢

您可能需要遍历
messageType
层次结构,调用
container.TryGetInstance
,直到找到处理程序

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

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