Выполнение небольшого чтения вокруг проекта, управляемого доменом, и кажется, что вы должны получить доступ ко всем сущностям в совокупности путем обхода из корня агрегата.Агрегаты перемещения
Однако в то же время вы должны попробовать и инкапсулировать свои данные, чтобы свойства/поля были защищены или закрыты.
Поэтому мой вопрос: если поля защищены/приватны, как вы должны проходить через агрегат?
Способ, которым я настроил это в данный момент, заключается в следующем: я отмечаю все свойства моей модели домена как внутренние с методами «настройки», отмеченными как защищенные. Таким образом, по крайней мере ничто вне модели не может получить доступ к свойствам, но объекты внутри модели могут получить доступ к другим объектам, и я все же разрешаю устанавливать свойства только внутри самого объекта.
Несмотря на то, что я сделал это, я все еще чувствую, что это должно применяться только к свойствам для других агрегатных объектов (я имею в виду, что «имя» клиента все равно будет частным, но их «Заказы» должны быть отмечены как внутренняя, чтобы обеспечить обход Клиента -> Заказы -> и т. д.)
У кого-нибудь есть рекомендации по этому вопросу?
EDIT:
Позвольте мне попытаться дать более конкретный пример вопроса: У меня есть два объекта в моем графике объекта: Книжная полка и книги. Скажем, ради этого примера, что Книжная полка является совокупным корнем и что Книги хранятся на книжной полке, так что это просто сущности внутри совокупности (Книжная полка имеет коллекцию книг).
Я хочу написать способ добавления новой книги на книжную полку. Следуя рекомендациям DDD, я считаю, что должен написать метод в классе Bookshelf, например AddBook (Book Book).
Однако, если есть требование о том, что на книжную полку не может быть добавлена книга с таким же названием. Мне нужна логика в методе Bookshelf.AddBook для проверки коллекции книг, чтобы убедиться, что эта книга еще не существует.
Проблема теперь в том, что я не могу этого сделать, поскольку я написал объект книги в красиво инкапсулированном виде, а его свойство «Имя» не является общедоступным.
Я понимаю, что это довольно надуманный пример, но я надеюсь, что это лучше иллюстрирует проблему. Я также понимаю, что это не просто проблема DDD, а инкапсуляция OO в действительности. Я уверен, что должен быть очень распространенный, простой способ решить то, что я пытаюсь сделать, и я сильно его переусердствовал.
Он отвечает на вопрос, и я полагаю, это то, что я имел в виду, говоря, что я его переусердствовал - это так же просто, как просто немного смягчить правила и сделать доступным свойство, но только в совокупности. Возникает вопрос, какие функции языка C# вы использовали бы, чтобы разрешить доступ к имени книги на книжную полку, но не к классам вне этого агрегата? (Думая об этом в терминах различных агрегатов для одного ограниченного контекста, находящегося в пределах одной сборки C#) – Justin