Создание единого универсального обработчика для Агаты? - PullRequest
1 голос
/ 28 апреля 2010

Я использую библиотеку запросов / ответов Agatha (и StructureMap, как используется Agatha 1.0.5.0) для сервисного уровня, который я создаю прототипом, и одна вещь, которую я заметил, это большое количество обработчиков, которые нуждаются в быть созданным. Как правило, имеет смысл, что любой паре типа запрос / ответ потребуется собственный обработчик. Однако, поскольку это масштабируется до крупной корпоративной среды, это будет ОЧЕНЬ МНОГО обработчиков.

Я начал делить домен предприятия на классы логических процессоров (десятки процессоров вместо многих сотен или, возможно, в итоге тысячи обработчиков). Соглашение состоит в том, что каждый тип запроса / ответа (каждый из которых наследуется от пары базовый запрос / ответ домена, которая наследуется от Агаты) получает в процессоре ровно одну функцию.

Общий обработчик (который наследуется от RequestHandler Агаты) затем использует отражение в методе Handle, чтобы найти метод для данного TREQUEST / TRESPONSE и вызвать его. Если он не может найти один или если он находит более одного, он возвращает TRESPONSE, содержащий сообщение об ошибке (сообщения стандартизированы в базовом классе ответа домена).

Цель здесь - позволить разработчикам по всему предприятию просто заняться написанием своих типов запросов / ответов и функций процессора в домене и не тратить дополнительные затраты на создание классов-обработчиков, которые все делали бы одно и то же (проход управление функцией процессора).

Однако, похоже, мне все еще нужно было определить класс обработчика (хотя и пустой, так как базовый обработчик позаботится обо всем) для каждой пары типа запрос / ответ. В противном случае при отправке запроса в службу выдается следующее исключение:

Код исключения StructureMap: 202 Экземпляр по умолчанию не определен для PluginFamily Agatha.ServiceLayer.IRequestHandler`1 [[TSFG.Domain.DTO.Actions.HelloWorldRequest, TSFG.Domain.DTO, Версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]], Agatha.ServiceLay , Версия = 1.0.5.0, Культура = нейтральная, PublicKeyToken = 6f21cf452a4ffa13

Есть ли способ, с помощью которого я не вижу, чтобы StructureMap и / или Agatha всегда использовали базовый класс обработчика для всех пар типа запрос / ответ? Или, может быть, использовать Reflection.Emit для генерации пустых обработчиков в памяти при запуске приложения просто для удовлетворения требования?

Я не на 100% знаком с этими библиотеками и учусь по ходу дела, но до сих пор мои попытки обоих этих возможных подходов были безуспешными. Кто-нибудь может дать какой-нибудь совет по решению этой проблемы или, может быть, предложить другой подход полностью?

1 Ответ

2 голосов
/ 29 апреля 2010

Я не знаком с Агатой. Но если вы хотите, чтобы все запросы на IRequestHandler<T> были выполнены на BaseHandler<T>, вы можете использовать следующую регистрацию StructureMap:

For(typeof(IRequestHandler<>)).Use(typeof(BaseHandler<>));

Когда кто-то запрашивает IRequestHandler<Foo>, он должен получить BaseHandler<Foo>.

...