Мы работаем над проектом, использующим DDD, но застряли на том, как обращаться с объектами поиска.
Например, у нас есть агрегат под названием «Клиент», а сущность «Клиент» также является корнем агрегата. Сущность "Customer" имеет свойство "CustomerTypeID".
Но у нас также есть сущность «CustomerType», представляющая все существующие типы клиентов (идентификатор и описание). Будет функция администратора, позволяющая пользователям поддерживать типы клиентов (т.е. добавление нового типа клиента и т. Д.).
Обратите внимание, что я говорю не об изменении типа клиента для конкретного клиента, а о ведении списка типов клиентов.
Приношу свои извинения за длинную историю, но вот мои вопросы:
Прав ли я, считая, что CustomerType является сущностью, а не объектом значения?
должен ли "CustomerType" быть внутри агрегата "Клиент" или он должен находиться внутри его собственного агрегата, так как мы будем обращаться к нему и поддерживать его вне контекста конкретного клиента?
если этот объект и любые другие объекты, которые являются базовыми объектами поиска (например, статус клиента, тип продукта и т. Д.), Должны быть агрегатами самостоятельно (и являться совокупными корнями этих агрегатов), я не собираюсь в конечном итоге с сотнями хранилищ? (поскольку у каждого агрегатного корня будет свой репозиторий)
Как вы можете видеть, я здесь запутался, и мне просто нужно указать в правильном направлении.
===================================
Я попытался написать какой-то код в ответ на ответ 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, в чем разница между совокупным и ограниченным контекстом? Не будет ли агрегат «Клиент» (где «Клиент» является корнем агрегата), который также содержит какие-либо сущности и объекты значений, которые существуют только в контексте Клиента, не быть ограниченным контекстом?