StructureMap: Как получить базовый обработчик сообщения для производного сообщения?(шаблон обработчика команд) - PullRequest
1 голос
/ 14 декабря 2011

У меня есть следующая иерархия сообщений, и я хочу, чтобы 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 Ответ

2 голосов
/ 14 декабря 2011

Вам, вероятно, придется пройти по иерархии messageType, совершая вызовы до container.TryGetInstance, пока не получите обработчик.

FYI - если вам не нужно искать иерархию типов, StructureMap имеет синтаксис для поддержки шаблона поиска обработчика для объекта на основе его типа:

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