Преобразование из N-Layer в DDD - PullRequest
0 голосов
/ 27 апреля 2018

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

Я надеюсь, что мне удалось описать мою проблему в этой диаграмме:

enter image description here

A - это мой текущий дизайн проекта веб-приложения, а B - мой целевой дизайн.

Я пытаюсь вставить всю логику из моего текущего BL в мои сущности так, чтобы строка кода была такой:

var customer = new CustomerLogic().GetCustomer(id);

Станет:

var customer = new Customer(id);

Или

var customer = Customer.Get(id);

Это становится еще более очевидным, когда я вижу полиморфную ситуацию.

Проблема в том, что, хотя в моем текущем дизайне ( A ) сущности просто используются, поэтому все проекты имеют ссылку на него, с будущим дизайном ( B ) сущности будут должен иметь ссылку на нижний уровень.

Но так как я также хочу, чтобы мой DAL доставлял мои сущности обратно вызывающему клиенту, у меня есть циклическая ссылка.

Мой текущий дизайн делает мой код более процедурным, чем Object Oriented, и я хочу это изменить.

Итак, как я могу решить эту циклическую ссылку, поддерживая DDD?

1 Ответ

0 голосов
/ 27 апреля 2018

Круговая зависимость разрешается путем инвертирования зависимости от сущностей (которые в DDD являются агрегатами, где каждый агрегат содержит один корень совокупности и ноль или более вложенных сущностей). Другими словами, уровень домена не должен зависеть от других уровней, таких как постоянство, приложение или представление.

Полный вариант использования будет выглядеть так:

customerId = request.get('customer_id')
customer  = repository.load(customerId)
customer.doSomethingImportant() //business logic that doesn't need anything from other layers
repository.save(customer)

Если каким-то образом вашему Агрегату требуется некоторая информация из за пределами , чтобы выполнить свою работу, то вы передаете эту информацию в качестве аргумента, например: customer.doSomethingImportant(some, info, fromOutside).

Важный аспект, на который следует обратить внимание, заключается в том, что методы Агрегата не изменяют ничего, кроме своего собственного состояния . Например, он не отправляет электронные письма, он не пишет в файлы, , даже в базу данных . Это мутированное состояние затем принимается хранилищем и сохраняется в базе данных. Таким образом вы инвертируете зависимость от DAL / базы данных.

В источнике событий это видоизмененное состояние принимает форму событий домена. В плоских / классических архитектурах репозиторий (часто ORM) вычисляет разницу и вносит изменения в базу данных.

...