我有以下消息层次结构,并希望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提供一些建议吗?
由于
答案 0 :(得分:2)
您可能必须遍历messageType
层次结构,在获得处理程序之前调用container.TryGetInstance
。
仅供参考 - 如果您不必查找类型层次结构,StructureMap具有支持根据类型查找对象处理程序的模式的语法:
handler = ObjectFactory.Container.ForObject(message).
GetClosedTypeOf(typeof(AbstractMessageHandler<>)).
As<IMessageHandler>();