Дизайн, управляемый доменом - родительская обработка детей - PullRequest
1 голос
/ 29 июня 2010

Я пытаюсь разобраться с хорошими принципами DDD, так что извините за этот вопрос, если он нубистский.

Возьмите объект Author, у которого есть коллекция Books. Мне нужно свойство IsAwardWinningAuthor для моего автора, чтобы каждая книга имела свойство IsAwardWinningBook. Буду ли я просто заставлять IsAwardWinningAuthor перебирать (или запрашивать, или что-то еще) коллекцию Книг в поисках любого экземпляра, где IsAwardWinningBook имеет значение true? Это правильное место для этой логики, даже если она может вызвать ленивую загрузку всех книг из моей базы данных?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 01 июля 2010

Не пытайтесь решить потенциальные проблемы с производительностью слишком рано (но не игнорируйте их тоже).

Как всегда, как вы фактически выполняете запрос, зависито характере данных и о том, как они будут использоваться.Если у вас есть пакетный процесс, выполняющий десятки / тысячи записей, вы должны позволить SQL Server позаботиться об этом.

Однако, если вам нужно выполнить запрос только один или два раза, сЧем меньше записей, тем быстрее вы получите цикл в памяти.

Недостающее решение для вас заключается в следующем: используйте спецификацию запроса , чтобы обернуть запрос и сделать Authorобъект использует эту новую спецификацию запроса.

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

Важной частью является : вашОбъект Author больше не отвечает за обработку запроса - вместо него используется Спецификация запроса .Изменение реализации спецификации запроса должно , а не влиять на поведение вашего Author.

. Подробнее см. На страницах 229-234 в книге Эвана.

0 голосов
/ 02 июля 2010

Я бы смоделировал это так, чтобы у Автора была информация, является ли он / она Победителем. Когда книга становится AwardWinning, она уведомляет своего автора (вызывая метод OnBookBecameAwardWinning), что она стала лауреатом премии. Этот метод может быть таким же простым, как установка флага AwardWinning для автора, или намного более сложным. Это зависит от конкретного случая.

0 голосов
/ 01 июля 2010

Я активно использую ORM (NHibernate) в своем текущем проекте, и я начинаю сильно склоняться к простой записи фрагмента информации, если это важно.В вашем случае я бы просто указал Автору, что они - автор, удостоенный наград.Если бы мне нужно было найти книгу, я мог бы написать специальный запрос, чтобы найти все их отмеченные наградами книги.Гораздо эффективнее это сделать, чем загрузить все книги, просто чтобы выяснить простой факт.

0 голосов
/ 01 июля 2010

Вопрос совсем не о доменном дизайне. Это о технологии.

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

К сожалению - мы не можем их игнорировать.

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

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

Другая распространенная проблема при использовании ORM, о которой вы можете не знать, это так называемая проблема выбора n + 1 .


О ДДД ...

Не останавливайтесь и не просто предполагайте, что Вы это понимаете. Это чертовски крепкий орешек.

...