Что вы делаете, если вам нужно создать список данных только для чтения на странице, и эти данные, естественно, будут поступать из нескольких, потенциально 5 или более разных репозиториев?
Мы используем DDD и форсируем доступ к нашей базе данных через репозитории, но есть сценарий, который не подходит для DDD, и мы пытаемся выбрать лучший шаблон для использования.
Например, предположим, что у вас есть веб-сайт сообщества с видео, форумами, блогами и т. д. У вас есть страница форума со списком комментариев. Это грубо, но я надеюсь, что это имеет смысл.
<table>
<tr><td>User Name (with possible link)</td><td>User's community score.</td><td>User Avatar</td><td>User's E-mail</td><td>User's blog</td><td>User's videos</td></tr>
</table>
<table>
<tr><td>This is a comment.</td></tr>
</table>
Таким образом, каждый комментарий содержит несколько разных частей: имя пользователя, оценку сообщества, аватар, адрес электронной почты, блог пользователя и страницу с видео пользователя. Традиционно все эти фрагменты информации поступали из отдельных репозиториев.
Проблема в том, что эффективность. Репозитории можно развернуть, но только вокруг того агрегата, для которого они созданы. Использование репозиториев становится неэффективным для доступа на чтение в тот момент, когда вам нужен доступ к данным, которые находятся более чем в одном репозитории.
Мое решение состоит в том, чтобы создать DTO UserInformation с соответствующей информацией и поместить метод в UserForumsRepository с подписью
ILIst<UserInformation> GetUserForumsUserInformationByForumPostID(int forumPostID).
Один из моих коллег предполагает, что использование DTO таким образом нарушает шаблон проектирования, который мы использовали, и предполагает, что лучшим способом было бы получить список идентификаторов комментариев форума, а затем передать эти идентификаторы в различные репозитории, чтобы вернуть Результаты.
Я считаю, что основной целью репозиториев является инкапсуляция бизнес-логики, которая важна для частей CUD CRUD, но списки только для чтения должны генерироваться так, как это имеет смысл. Если это уместно, я думаю, что даже имеет смысл полностью удалить методы списка только для чтения из репозитория (например, в общем виджете, который используется на нескольких страницах разных типов).
Как вы справляетесь с этой ситуацией?