1) В большинстве случаев каждый Aggregate Root
должен определить свою собственную транзакционную границу , и в этом случае нам не нужно открывать интерфейс IUnitOfWork
в Domain Layer
.Нарушение интерфейса IUnitOfWork в слое домена нарушает правило ненасилия?
а) Я предполагаю, что в этой ситуации хороший вариант был бы для repository
(используется aggregate
для обеспечения invariants
применяется в него), чтобы содержать свой собственный экземпляр UoW
(при использовании EF, то это UoW
экземпляра может быть просто типа DbContext
)?
2)
а) Но если по какой-либо причине transaction
охватывает несколько aggregates
(таким образом, более чем один aggregate
должен быть изменен на один раз), то не Domain Layer
также должны содержать IUnitOfWork
интерфейс?
б) Не подвергая IUnitOfWork
интерфейс в Domain Layer
нарушают живучесть правило невежество?
с) Если да б), не подвергая затем IUnitOfWork
поражение цели с repositories
?
Ответ Алексея Рага:
1) I would advice against exposing repositories to aggregates. Repositories are there to give you aggregates, that's it.
а) Хотя я полагаю, что большинство ДДД архитекторов не имеют проблем с обнажая сделок РЕПО с агрегатами (я только с просьбой потому что я прочитал несколько статей о репозиториях и DDD, и впечатление, которое я получил, заключается в том, что авторы не против выставления репозиториев для агрегатов, но теперь я не так уверен)?
b) Итак, вы также не подвергаете размещению репозиториев службам домена?
c) Судя по вашему ответу, я предполагаю, что вы считаете, что выставляете IUnitOfWork
как нарушение ПИ?
2) Note that although my command handler (app service in a way)...
ли вы обычно реализации обработчиков команд, как приложение услуг?
3)
public void Handle(ApproveOrderCommand command)
{
var order = Repository.Get(command.OrderId);
property.Approve(command.Comment, ServiceRequiredForOrderApproval);
Repository.Save(order);
}
property.Approve(...)
ли опечатка, и вы на самом деле имел в виду order.Approve(...)
?
Thanx заранее
Наличие интерфейса IUnitOfWork как части вашего домена не обязательно является плохим, так же как и ваши интерфейсы репозитория, часть вашего домена тоже не плохо. Пока они явно отличались от вашей реализации. – stephenl
@stephenl: Точка репозитория - это абстрагирование от настойчивости. Но не является ли интерфейс IUnitOfWork самой деталью персистентности и как таковой, введя его в слое домена, мы просочились детали сохранения в уровень домена? – bckpwrld
Интерфейс на самом деле не реализует ничего такого, чтобы поддерживать это в домене нормально. Реализация этого интерфейса может различаться в зависимости от используемого внутреннего хранилища и, следовательно, должна быть внешней для вашего домена. – stephenl