Лучший способ инкапсулировать логику создания - PullRequest
0 голосов
/ 18 марта 2019

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

У меня есть веб-проект на C #, который создает пользователей в нескольких местах, подобных этому.:

var user = /*create user somehow*/;
_userRepository.Add(user);
_userRepository.SaveChanges();

Теперь мне нужно добавить логику, которая отправляет уведомления по электронной почте при каждом создании пользователя:

var user = /*create user somehow*/;
_userRepository.Add(user);
_userRepository.SaveChanges();
_notificationService.SendUserCreatedNotification(user);

Проблема в том, что я не хотел бы добавлять то же самоестрока кода для всех мест, где создается новый пользователь (СУХОЙ!).

Теперь я мог бы обернуть логику Add / Save / SendUserCreatedNotification в отдельный сервис:

var user = /*create user somehow*/;
_userCreationService.AddAndSave(user);

Но:

  • цель этого сервисабыть странно логически (добавлять пользователя в репо, сохранять изменения в репо, отправлять уведомления);Я даже не могу придумать хорошее имя для этого сервиса и метода
  • Метод сервиса будет иметь только 3 строки кода: Add / Save / SendUserCreatedNotification

Как вы обычнорешать такие задачи?Подход 2 - лучший путь?Или, может быть, существует лучший подход 3?

1 Ответ

0 голосов
/ 18 марта 2019

Одним из возможных решений будет отправка этого уведомления методом _userRepository.SaveChanges();.Вы бы проверили свой трекер изменений UoW для всех пользовательских объектов, которые находятся в состоянии «Создано», и отправили бы эти уведомления после фиксации.

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

Вместо этого вы можете запустить событие из_userRepository.SaveChanges(); и подпишитесь на это событие в вашей основной логике.

Я бы выбрал следующий подход:

  • В _userRepository.SaveChanges(); для каждого созданного пользователя, запустить UserCreatedEvent событие, которое будет содержать информацию о пользователе.
  • Подписаться на это событие в вашей основной логике и вызвать _notificationService.SendUserCreatedNotification(user); из обработчика события.

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

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