2010-04-28 2 views
1

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

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

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

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

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

StructureMap Код исключения: 202 Нет По умолчанию Instance определенно для PluginFamily Agatha.ServiceLayer.IRequestHandler`1 [[TSFG.Domain.DTO.Actions.HelloWorldRequest, TSFG.Domain.DTO, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]], Agatha.ServiceLayer, Version = 1.0.5.0, Culture = neutral, PublicKeyToken = 6f21cf452a4ffa13

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

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

ответ

2

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

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

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

+0

Потребовалось немного грязной работы, которую я хочу очистить, но вы определенно указали мне в правильном направлении. Мой предыдущий пользовательский обработчик был быть определен как: общественного класса DomainRequestHandler : RequestHandler где TREQUEST: BaseRequest где TRESPONSE: BaseResponse, новый() но сейчас: общественного класса DomainRequestHandler : IRequestHandler где TREQUEST: BaseRequest Это предполагало реализацию еще несколько процедур для интерфейса, которые на самом деле не делать ничего, поэтому я буду видеть, как это идет. Спасибо! – David

+0

Уг, извините за плохое форматирование там. Я надеялся, что StackOverflow сохранит интервал :( – David