Взгляните на дизайн, управляемый доменом. DDD перемещает большую часть логики в сущности (Order
, Email
) и позволяет им использовать репозитории.
1) Если служба воспроизводит методы CRUD, как мы видим, мы можем воспроизводить код без реальной выгоды. Или пользовательский интерфейс должен вызывать хранилища напрямую?
Служба в DDD используется, когда вы пишете бизнес-логику вне сущностей.
2) Что происходит, когда службе требуется вызвать другую службу. В нашем примере выше, если службе электронной почты необходимо получить все заказы, вводим ли мы службу заказов в службу электронной почты?
Внедрить его в конструктор. Однако служба заказа должна отправить электронное письмо, а не наоборот.
Подход DDD заключается в создании OrderNotificationService
, который принимает событие домена OrderCreated
и составляет электронное письмо, которое отправляется через EmailService
Обновление
Вы меня не поняли. Дублированная логика никогда не бывает хорошей. Я бы не стал размещать метод в моем сервисе с именем GetAll
, когда в моем репозитории он есть. Также я бы не использовал этот метод в своей сущности.
Пример кода:
var order = repository.Create(userId);
order.Add(articleId, 2);
order.Save(); // uses the repository
Order.Send()
должен создать событие домена, которое OrderNotificationService
может перехватить.
Update2
Repository.Create
- это просто фабричный метод (google factory method pattern
), чтобы получить все создания модели домена в одном месте. Он ничего не делает в БД (хотя мог бы в будущих версиях).
Что касается порядка. Сохраните его, используя хранилище для сохранения всех строк заказа, самого заказа или чего-либо еще, что потребуется.