Я пытаюсь реализовать простую архитектуру DDD/CQRS без использования событий-источников.Где я должен поместить логику для запроса дополнительных данных в потоке команд CQRS
В настоящее время мне нужно написать код для добавления уведомления к объекту документа (документ может иметь несколько уведомлений).
Я уже создал команду NotificationAddCommand, ICommandService и IRepository.
Прежде чем вставлять новое уведомление через IRepository, я должен запросить текущий user_id из db, используя свойство NotificationAddCommand.User_name.
Я не знаю, как сделать это правильно, потому что я могу
- Использование
IQuery
от чтения потока. - Передайте имя пользователя домену и разрешите user_id в репозитории.
Код:
public class DocumentsCommandService : ICommandService<NotificationAddCommand>
{
private readonly IRepository<Notification, long> _notificationsRepository;
public DocumentsCommandService(
IRepository<Notification, long> notifsRepo)
{
_notificationsRepository = notifsRepo;
}
public void Handle(NotificationAddCommand command)
{
// command.user_id = Resolve(command.user_name) ??
// command.source_secret_id = Resolve(command.source_id, command.source_type) ??
foreach (var receiverId in command.Receivers)
{
var notificationEntity = _notificationsRepository.Get(0);
notificationEntity.TargetId = receiverId;
notificationEntity.Body = command.Text;
_notificationsRepository.Add(notificationEntity);
}
}
}
Что делать, если мне нужно более сложную логику, прежде чем вставить? Можно ли использовать IQuery или создавать дополнительные службы?
Обработчик команд должен быть введен другим специализированным сервисом. Кстати, ваш код очень странный. Я уверен, что он не отражает вообще язык экспертов домена, когда они описывают вариант использования «добавить уведомление». Во всяком случае, даже «добавление» уведомления не имеет смысла ... уведомление позволяет вам узнать о чем-то, что произошло, например о событии. Вы пытаетесь переписать историю? – plalx
Уведомление похоже на сообщение о чем-то, оно содержит свойства notificationBody и notificationTargetUserId –