Как иметь дело с объектом значения, который должен искать данные в базе данных - PullRequest
5 голосов
/ 15 февраля 2009

Я только начинаю с изучения доменного дизайна, и вполне возможно, что мое понимание разделения сущностей / ценностей неверно, поэтому, если это так, пожалуйста, дайте мне знать.

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

Это создает для меня дилемму, поскольку в моем случае адрес содержит страну, в которой у страны есть название и код страны, а список кодов стран предполагается загружать из базы данных.

Мой вопрос: как мне это спроектировать? Я хочу, чтобы люди могли создавать адрес с помощью оператора new, но я не хочу создавать объект доступа к данным для страны, и если я это сделаю, я определенно не хочу помещать ссылку на него в объекте адреса. 1007 *

У меня есть некоторые идеи, но я хотел бы услышать любые предложения, которые у кого-либо могут быть.

Ответы [ 4 ]

3 голосов
/ 15 февраля 2009

в DDD нет ничего, что мешало бы объектам значений хранить ссылки на сущности. Поэтому в вашем адресе будет указана ссылка на организацию страны.

1 голос
/ 17 февраля 2009

Если пойти по пути DDD, вы сначала должны подумать о потребностях своего приложения и построить модель оттуда.

Вам не нужно беспокоиться о том, что Страна используется только в Адрес. Само по себе это не значит, что он является сущностью. Главный вопрос: вы думаете о стране как о чем-то, имеющем идентичность, или она определяется только атрибутами? Если у вас две страны с одинаковым названием (и одинаковым кодом страны), можете ли вы увидеть разницу?

Может быть, вам стоит подумать о том, чтобы сделать страну ценным объектом. Это не мешает вам иметь какой-либо список загрузки репозитория стран из БД или загружать страну на основе ее кода. Что касается реализации, ваш репозиторий может по-прежнему загружать список стран из базы данных один раз и кэшировать его в памяти. Или это может быть жестко закодировано или прочитано из XML. Для вашей доменной модели все равно.

Вероятно, вы создадите фабричный метод для адреса, который принимает код страны среди других параметров. Затем он будет использовать хранилище для создания экземпляра Country и возврата правильного объекта Address.

Думая об агрегатах, вы также можете получить представление о макете хранилища.

Надеюсь, это поможет

1 голос
/ 15 февраля 2009

Позвольте мне начать с того, что мой единственный опыт в области доменного дизайна - это чтение статьи в Википедии несколько минут назад. При этом, вот мои мысли по вашему вопросу:

Я согласен, что объект адреса не должен требовать каких-либо объектов доступа к данным, так как насчет фабрики адресов, которая обрабатывает коды стран и создает объекты адреса на основе входных данных пользователя? Таким образом, фабрика будет содержать объекты доступа к данным, а ваш адресный объект может оставаться только для значения.

Если, согласно DDD, это не кошерно, пожалуйста, дайте мне знать. Мне любопытно посмотреть, что придумает остальная часть сообщества.

0 голосов
/ 15 февраля 2009

Это создает дилемму для меня, так как в в моем случае адрес содержит страну где Страна имеет имя и код страны и список коды стран должны быть загружены из базы данных.

Объект Address не будет иметь список стран в качестве своего свойства. Скорее, это будет один экземпляр объекта страны. Уровень представления предоставит список объектов Country, возможно, находящихся в раскрывающемся списке. После загрузки одного конкретного адреса вы должны установить значение раскрывающегося списка равным идентификатору страны объекта страны, который является свойством объекта адреса. Другими словами:

myDropDown (содержит список объектов Country) значение выбранного объекта = address.Country или значение ключа myDropDown = address.Country.ID

Теперь, чтобы заполнить слой Presentation, ваш уровень доступа к данным должен предоставить функцию, которая возвращает необработанный список объектов Country. В смысле .NET это будет что-то вроде:

Namespace Dal

    Public NotInheritable Class Countries
    ...
    Public Shared Function Read(ByVal countryId as Integer) As BusinessObjects.Country
    ...
    Public Shared Function ReadList() As List(Of BusinessObjects.Country)
    ...
...