Мы работаем над проектом с использованием DDD, но зацикливаемся на том, как обрабатывать объекты поиска. Например, у нас есть агрегат под названием «Клиент», а сущность «Клиент» также является корневым агрегатом. Сущность «Клиент» имеет свойство «CustomerTypeID».
Но у нас также есть сущность «CustomerType», представляющая все существующие типы клиентов (ID и описание). Будет функция администратора, позволяющая пользователям поддерживать типы клиентов (например, добавлять новый тип клиентов и т. Д.).
Обратите внимание, что я говорю не об изменении типа клиента для конкретного клиента, а о ведении списка типов клиентов.
Приношу свои извинения за долгую историю, но вот мои вопросы:
Прав ли я, думая, что «CustomerType» - это сущность, а не объект-значение?
должен ли «CustomerType» находиться внутри агрегированного «Customer» или должен быть внутри его собственного агрегата, поскольку мы будем получать к нему доступ и поддерживать его вне контекста конкретного клиента?
если этот объект и любые другие объекты, которые являются основными объектами поиска (например, статус клиента, тип продукта и т. д.), должны быть агрегированы сами по себе (и являться агрегированными корнями этих агрегатов), я не собираюсь в конечном итоге иметь сотни репозиториев ? (поскольку каждый совокупный корень будет иметь свой собственный репозиторий)
Как видите, я запутался здесь, и мне просто нужно указать правильное направление.
=================================== Я попытался написать код в ответ на ответ eulerfx, но не смог ' Чтобы заставить его работать, я положу его сюда.
Что касается пункта 2, на экране мы, очевидно, всегда будем показывать только описание типа (например, «Личный»). Значит ли это, что я получу что-то вроде этого ?:
Public Class Customer
Inherits EntityBase(Of Integer)
Implements IAggregateRoot
Public Property CustomerID As Integer
...
Public Property CustomerType As CustomerType
...
а также
Открытый класс CustomerType Наследует EntityBase (Of Integer) Реализует IAggregateRoot
Public Property CustomerTypeID As Integer
Public Property CustomerTypeDescription As String
Или свойство внутри класса «Customer» должно быть CustomerTypeID?
Что касается пункта 3, в чем разница между агрегированным и ограниченным контекстом? Разве агрегат «Клиент» (с «Клиентом» является агрегатным корнем), который также содержит любые сущности и объекты значений, которые существуют только в контексте Клиента, не будет ограниченным контекстом?