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