Загрузка объекта 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
определяется не его атрибутами (то есть строкой, обозначающей его имя), а его идентичностью.