Загрузка объекта Value в List или DropdownList, DDD

Мне нужно кое-что прояснить.

У Лица Аггреагат, 2 ВО (Страна, Штат Провинция).

Я хочу загрузить всю страну в моем слое презентации (я использую MVC)

Эван говорит, что вы используете репозиторий (IPersonRepository) только для работы с корневым объектом (он всегда должен возвращать только ссылку на Aggregate Root)

   public interface IPersonRepository()
   {
     void savePerson(Person p);
     void removePerson(Person p);
     Ilist<Person> getPerson();
   }

что я обычно делаю, чтобы решить это:

Добавьте в IPersonRepository этот метод

IList<Country> LookupCountrysOfPerson();

На уровне Infra реализуют доменные интерфейсы следующим образом:

public IList<Person> LookupCountrysOfPerson()
{
    return Session.CreateQuery("from Countrys").List<Person>());
}

Мой партнер говорит, что я неправ.

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

Каков наилучший способ сделать это?

с кодом пожалуйста!:)

4 ответа

Решение

Эванс также говорит (стр. 170): "Базовая сущность, такая как Местоположение, может использоваться многими объектами по многим причинам..."

Я также хотел бы рассмотреть вопрос о том, чтобы сделать страну юридическим лицом по причинам, указанным выше. Возможно, более важно, это объект низкого уровня. Вы, вероятно, также предоставляете страну по конфигурации, а не по фактическим действиям в домене. Поэтому я удалил бы это из Человека и сделал бы это отдельным существом.

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

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

Этот вопрос чем-то похож на тот, на который я недавно ответил:

Простой сводный вопрос о корне и хранилище

Мое предложение состоит в том, чтобы вы внедрили службу Lookup, которую ваш клиент может использовать и которая кэшируется. Игнорируйте правила DDD и все, что связано с агрегатами или репозиториями для этого. Как уже упоминал кто-то, именно здесь вступает в игру идеология CQRS; клиент не должен проходить через домен, чтобы получить данные. Домен чисто транзакционный, не предназначен для запросов.

В этой статье объясняется, как создать универсальный сервис поиска для справочных данных для вещей, которые обычно заполняют выпадающие списки в пользовательском интерфейсе (например, название, страна и т. Д.)

http://wtfperminute.blogspot.com/2011/02/working-with-reference-data-lookups.html

Если в вашей доменной стране фактически есть VO (вы не хотите поддерживать поток идентификаторов в имени страны, которое было изменено и т. Д.), Что является наиболее распространенным сценарием, я бы добавил специализированный класс в слой доступа к данным для возврата список всех стран как ВО. Я также добавил бы кеширование (кэш 2-го уровня в NHibernate) к сущности страны и перечислил бы все запросы стран, чтобы мне не приходилось каждый раз обращаться к БД.

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

Похоже, что страны на самом деле не являются объектами ценностей здесь; они имеют отличительные особенности и важны для деловых целей за пределами вашего Person объекты. Они должны стать сущностями и относиться к ним соответствующим образом.

Подумайте об этом так: допустим, в какой-то нестабильной стране свергли нынешнего диктатора и сменили имя. Person ссылка на объект Country должно быть действительным, потому что Country определяется не его атрибутами (то есть строкой, обозначающей его имя), а его идентичностью.

Другие вопросы по тегам