Поскольку я работаю с моим пониманием проекта, управляемого доменом, я нахожу, что у меня есть правило, которое, похоже, работает, хотя я бы хотел, чтобы он был чрезмерным, и также хотел бы видеть другие перспективы в той же ситуации.DDD Когда я должен создать объект домена и объект persistence вместо использования объекта persistence в качестве объекта домена?
Мой вопрос заключается в следующем: «Когда модель домена и модель сохранения сохраняются в отдельных объектах?» Мой язык выбора - это Java на данный момент, и я использую модель репозитория Spring Data.
Я вижу три основных ответа на мой вопрос.
- Всегда используйте отдельные объекты домена из объектов сохранения.
- Использование отдельных объектов домена только при использовании методов домена (поведения) на объектах сохранения не является практичным.
- Использовать объекты сохранения как объекты домена во всех случаях.
Чтобы задать вопросы о DDD, я обнаружил, что должен использовать пример ограниченного контекста, поскольку я еще недостаточно знаю об DDD, чтобы спросить более абстрактным образом.
Вот мой иллюстративный контекст ограничен: скажем, у меня есть система кодификации со следующими бизнес-правилами:
- Каждый закон о книгах должны быть классифицированы.
- Каждый закон имеет идентификатор с двумя частями, префикс номера кодификации и суффикс коаксигации кодирования. (Пример: 100-0100, 599-2030).
- Существует множество правовых юрисдикций, которые используют систему кодирования законов, и они должны иметь возможность создавать свои собственные соратники, но префиксы кодификации являются глобальными и должны быть одинаковыми во всех юрисдикциях для облегчения общей сопоставимости.
- префиксы номера кодировки сгруппированы в широкие категории кодирования. Кодификация категория имеет диапазон номеров, например, 100-199, 200-299, 700-799 и т.д.
Чтобы выразить это ограниченный контекст как модель инерционности я следующее:
table: codification
fields: chart_code, prefix, coassign, codification_category
table: codification_chart
fields: chart_code, jurisdiction_description
table: codification_category
fields: category, low_category_number, high_category_number, description
table: global_codification
fields: prefix, coassign, codification_category
Я знаю, сначала я должен начать с модели домена. У меня есть модель настойчивость и модель предметной области
В моей модели домена У меня есть домен три объектов
public Codification {
private String prefix, coassign;
codificationCategory codificationCaegory; // an enum type
public Codification(...) { // set private vars }
// getters for private variables
}
public CodificationChart {
private List<Codification> chartCodifications = new ArrayList<>();
private String chartCode;
// public constructor to initialize private variables
// getters for private variables
public Codification addCodificationToChart(Codification){...}
public void removeCodificationFromChart(Codification){...}
public boolean checkCodificationInChart(Codification){...}
}
public enum CodificationCategory {
CIVIL, CRIMINAL, PROPERTY, CORPORATE, FAMILY, CONSUMER, ETHICS, BANKRUPTCY;
}
ORM объектов:
JPA Mappings of the tables mentioned earlier with the "Entity" suffix added to their table names.
They are omitted for brevity.
Each one contains getters and setters like JPA Pojos do.
If someone asks for the Persistence objects code I will post it.
Единственная точка, в которой мои объекты области знают о модель настойчивости находится в моем заводском объекте CodificationChartFactory
, который имеет интерфейсы репозитория, которые я использую для взаимодействия с объектами ORM, упомянутыми ранее. Эта фабрика является единственной частью домена, которая использует репозитории сохранения, таким образом, единственную часть, которая взаимодействует с уровнем сохранения.
Создает отдельную модель домена здесь расточительное усилие? Я могу видеть, как можно поместить мое поведение CodificationChart в объект Persistence. Это как-то не так, чтобы помещать эти поведения в объект персистентности, единственной задачей которого является получение записи из базы данных.
Я определенно поддаюсь исправлению.
спасибо за перспективу. Я немного боялся смешивать домен и настойчивость, потому что я думал, что другие профессионалы этого не сделали. Я попробую и посмотрю, как мне это нравится. Я согласен с тем, что разделение в случае использования JPA определенно похоже на другой уровень сложности, который не является абсолютно необходимым. Мне нравится, как вы больше ответили на все вместе. Я хотел бы видеть ответ, когда кто-то защищает их, чтобы я мог видеть, есть ли веские основания для этого в случае использования JPA. –
Это точно, где я стою, спасибо Августо за то, что он поставил его лучше, чем я бы хотел :) Также, я не очень много знаю о Java, но не существует альтернативы «навязчивым» JPA-аннотациям, в которых будут отображаться данные сопоставления экстернализированный к некоторому файлу «свободного отображения» (например, хорошая конфигурация XML ORM старых дней, но в коде)? Это очень помогло бы с сохранением невежества ИМО. – guillaume31
@ guillaume31 Hibernate все еще поддерживает XML-сопоставления (много лет назад у меня были коллеги, которые предпочли этот подход, поэтому между производственным кодом и отображением не было бы никакой статической связи). Я не знаю какого-либо расширения, которое могло бы позволить определить отображение в красивой DSL ... но это может быть вопрос построения одного (к сожалению, это было бы ORM специфично). Последнее ... Я никогда не видел приложения, где доступ к данным был на 100% прозрачным в Java, он всегда является пропущенной абстракцией. – Augusto