Могу ли я позвонить в отдел обслуживания DDD для справочной службы? - PullRequest
0 голосов
/ 07 июля 2019

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

    using System;
using System.Threading.Tasks;
using Monex.Domain.Identity.Aggregates;
using Monex.Domain.Identity.Exceptions;
using Monex.Domain.Identity.Repository;
using Monex.Domain.Identity.SeedWork;

namespace Monex.Domain.Identity.Services {
    public class UserService {
        readonly IUserConfirmationService _confirmationService;
        readonly IUserRepository _userRepository;
        readonly IUnitOfWork _unitOfWork;
        public UserService (IUserRepository userRepository, IUnitOfWork unitOfWork, IUserConfirmationService confirmationService) {
            _userRepository = userRepository;
            _confirmationService = confirmationService;
            _unitOfWork = unitOfWork;
        }

        public async Task CreateUser (string email, string password, string city) {
            var emailExists = await _userRepository.CheckEmailExists (email);
            if (emailExists)
                throw new EmailAlreadyRegisteredException ();
            var newUser = new User (Guid.NewGuid (), email, password);
            var confirmation = newUser.CreateEmailConfirmation ();
            _userRepository.Add (newUser);
            await _unitOfWork.SaveChanges ();
            await _confirmationService.SendEmail (confirmation);
        }
    }
}

1 Ответ

2 голосов
/ 07 июля 2019

Общепринятый механизм не позволяет доменным службам взаимодействовать с инфраструктурой - они обычно не работают с транзакциями и единицами работы.Они принадлежат к уровню модели домена вместе с агрегатами, обрабатывают сложные случаи использования, которые обычно включают в себя более одного агрегата, и должны быть лишены инфраструктурных проблем, включая постоянство и уведомления.

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

Из вашего примера вы, вероятно, должны рассматривать UserService как службу приложенийвызовите factory method в User Aggregate, чтобы создать новый пользовательский объект, а затем сохраните его с помощью repository.

Теперь к хорошей части:

  • Интересная схема, которую я использовал в прошлом, заключается в том, что уведомления (например, отправка электронных писем) рассматриваются как часть самой единицы работы.UoW не только фиксирует все изменения данных, но также отвечает за отправку «зарегистрированных» уведомлений.Вы только регистрируете / отправляете уведомления и позволяете UoW выполнять фактическую отправку после успешной фиксации.

  • Лучшим способом является публикация события с соответствующими деталями и использование подписчика.составить и отправить уведомление.

...