Можно ли вызывать одну прикладную службу из другой прикладной службы? - PullRequest
2 голосов
/ 08 ноября 2010

Это веб-сайт ASP.NET MVC.

Следуя доменному дизайну, у нас есть сервисный уровень. Наши контроллеры просят классы обслуживания приложений выполнять различные задачи, а затем направлять результаты в представления.

Бизнес-логика осуществляется по классам обслуживания.

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

Таким образом, функция подписки на новостную рассылку тесно связана с регистрацией / изменением учетной записи.

Однако я чувствую, что было бы лучше иметь отдельный класс обслуживания NewsletterTasks для действий подписки / обновления / отмены подписки.

Но этот класс будет использоваться не контроллером, а классом AccountTasks.

Итак, рабочий процесс будет выглядеть так:

-> request made to controller action

-> controller calls AccountTasks

-> AccountTasks creates a user acoount

-> AccountTasks calls NewsletterTasks

-> NewsletterTasks subscribes the user to the newsletter

-> AccountTasks returns the result to the controller

-> controller fetches the appropriate view and sends it to the client

В качестве альтернативы, я бы сначала вызвал контроллер AccountTasks, а затем использовал бы результат NewsletterTasks. Но при таком подходе я чувствую, что контроллер слишком много знает о рабочем процессе, тогда как он должен просто передавать данные и результаты.

Задачи - это классы службы приложений, проект основан на архитектуре S # arp с некоторыми изменениями Кто может мне помочь - сюда входят соглашения об именах для некоторых вещей.

Можно ли звонить NewsletterTasks с AccountTasks? Как бы вы это сделали?

Ответы [ 2 ]

3 голосов
/ 09 ноября 2010

Я бы хотел создать явную UserRegistration Доменная служба :

-> request made to controller action

-> controller calls UserRegistrationService

-> UserRegistrationService calls AccountTasks

-> AccountTasks creates a user acoount

-> UserRegistrationService calls NewsletterTasks

-> NewsletterTasks subscribes the user to the newsletter

-> UserRegistrationService returns the result to the controller

-> controller fetches the appropriate view and sends it to the client

, которая, в свою очередь, отвечает на ваш вопрос: Да,ОК, чтобы позвонить в другие службы из вашей службы

Надеюсь, это поможет!

0 голосов
/ 09 ноября 2010

Я бы рекомендовал проект, в котором контроллер вызывает обе задачи.Да, это накладывает дополнительную ответственность на контроллер, но, с другой стороны, устраняет несколько неловкую ответственность AccountTasks за вызов NewsletterTasks.Кто-то другой должен решить, следует ли подписаться на рассылку для определенного пользователя (событие в настоящее время подписано на всех пользователей).

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

Ваш дизайн немного похож на «Метод» Ювала Лоуи, а ваши задачи несколько похожиего менеджерам, так что вы можете взглянуть на его бумаги .

...