Требуются мнения: лучше ли подключать или отключать сущности в доменной модели? - PullRequest
1 голос
/ 15 октября 2008

Я начинаю новый проект; Я хочу следовать подходу DDD. Мы поговорили с бизнесом и немного углубились в предметную область (интернет-телевидение).

Команда из пяти человек сильная и распределенная. Мы приняли шаблон репозитория для доступа к данным. В целом мы следуем сервисному подходу; службы отвечают за выполнение операций, и некоторые операции мы представим через API REST, а некоторые - через наши собственные клиентские приложения.

Люди, которые не имеют опыта работы с ORM (не то, что у меня сейчас огромное количество, тоже хотят моделировать сущности без отношений между ними), обосновывая это тем, что это заставляет разработчиков, использующих хранилища, точно знать какое влияние они оказывают на базу данных. Я пытаюсь указать, что это в конечном итоге приведет к очень болтливому набору сервисов, большему количеству кода для сопровождения и тестирования и модели предметной области, которая в корне не соответствует сути. Я не думаю, что это хороший подход, и никто из тех, с кем я говорил об этом.

Их желание реализовать этот подход - Linq2SQL под фасадом хранилища. Для этого требуется вторая модель, класс / слой отображения между ним и моделью предметной области и большое дублирование в репозиториях, поскольку кажется невозможным (что мы видели до сих пор) написать общий репозиторий. Также невозможно отобразить объекты L2S, которые используют наследование (что означает, что КАЖДЫЙ объект должен иметь свойства для созданного, созданного и т. Д.)

1-й вопрос: Может кто-нибудь предложить мне какой-нибудь совет о том, как изменить свое мнение? Я нахожусь в процессе написания побочного проекта, который использует NHibernate, который, конечно, хорошо поддерживает DDD-подход, на основе того, что «Покажи мне код» является мощным аргументом.

2-й вопрос: Какие вещи я должен попытаться продемонстрировать в своем стороннем проекте NHibernate-on-my-own-time? Я новичок в этом; одна из них не нравится NHibernate - это кривая обучения и требования к XML; Мой контраргумент - это мощный инструмент, а Fluent NHibernate устраняет необходимость в XML. Им все еще не нравится это.

Ответы [ 4 ]

3 голосов
/ 22 октября 2008

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

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

1 голос
/ 22 октября 2008

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

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

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

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

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

Это в основном сводится к базовым принципам High Cohesion и Low Coupling, которые являются противоборствующими силами, необходимо попытаться сбалансировать их в решении. Если у вас нет отношений (или неявных), то вы получаете низкую связь за счет сплоченности и, возможно, создаете проблемы обслуживания, если действительно существуют отношения, которые не представлены, или увеличиваете зависимости на более высоком уровне. Если вы навязываете слишком много отношений, вы в конечном итоге превратите свою модель предметной области в грязь и неуправляемость. Конкретный совет по этому вопросу является сложным, однако, как правило, я бы начал с построения модели с агрегатами, сосредоточив внимание на отношениях внутри агрегата и часто просматривая модель.

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

1 голос
/ 15 октября 2008

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

"Make everything as simple as possible, but not simpler."
   -- Albert Einstein 

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

0 голосов
/ 22 октября 2008

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

...