Должен ли я отправлять электронную почту на уровне службы или на уровне контроллера? - PullRequest
6 голосов
/ 27 апреля 2009

Я использую шаблон MVC в ASP.NET, используя сервис (BLL) и уровни хранилища для управления данными. В некоторых случаях я хочу отправить автоматическое электронное письмо при отправке нового запроса через наш веб-сайт. На каком уровне архитектуры следует отправлять это электронное письмо? На уровне контроллера или на уровне обслуживания? Я думал об уровне обслуживания, поскольку именно здесь должна идти «бизнес-логика», но я не уверен на 100%, является ли это семантически правильным.

Редактировать: когда я говорю «новый запрос», я имею в виду, что пользователь выполняет действие, которое сохраняет в каком-либо хранилище данных. В качестве примера они создают новый «Проект» на сайте. Таким образом, запрос будет проходить через уровни контроллера> службы> хранилища.

Ответы [ 7 ]

16 голосов
/ 27 апреля 2009

Согласовано. Они принадлежат на уровне обслуживания. Контроллер должен только быть очень тонким; просто вызов соответствующих бизнес-классов / классов данных / любых других классов и сброс данных в совпадающем представлении.

5 голосов
/ 27 апреля 2009

В большинстве случаев вы можете прояснить подобные проблемы, думая о том, что бы вы хотели случиться, если бы вместо вашего веб-приложения у вас был слой веб-службы или приложение для Windows перед BLL. Вы все еще хотели бы, чтобы то же самое электронное письмо вышло? Если ответ «да», то отправка электронного письма является частью вашей бизнес-модели и должна быть включена в список BLL. если ответ «нет», то отправка электронного письма - это действительно логика приложения, и она должна идти на уровне приложения.

5 голосов
/ 27 апреля 2009

Я всегда проектирую свой бизнес-уровень так, чтобы он мог работать независимо от среды, через которую представлены данные. Так, например, если бы я отправил электронное письмо при создании новой учетной записи, я бы хотел, чтобы это происходило независимо от того, создает ли пользователь учетную запись через веб-сайт или приложение для настольного компьютера. В этом случае отправка электронной почты будет происходить на бизнес-уровне, поскольку она является общей для обоих носителей.

4 голосов
/ 27 апреля 2009

Я бы вставил его в сервисный слой.

1 голос
/ 27 апреля 2009

в миксе и pdc phill сказал в своем выступлении,

thin controllers, fat models
0 голосов
/ 28 апреля 2009

Если бы это была основная бизнес-функция, я бы поставил ее на уровень обслуживания.

Однако я могу абстрагировать класс «MailSender», чтобы мой уровень обслуживания не был явно привязан к отправке электронной почты определенным образом (например, с помощью System.Web.Mail). Вы можете использовать другой метод позже (например, асинхронная отправка почты с использованием очередей). Это также позволяет вам безопасно выполнить модульное тестирование без спама (заменив MailSender на тот, который фактически не отправляет почту):)

0 голосов
/ 27 апреля 2009

На самом деле у меня просто есть действия контроллера в моих контроллерах. Вся остальная бизнес-логика решается каким-то другим слоем, каким бы он ни был.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...