Как я могу иметь репозитории и как они должны взаимодействовать, если они вообще есть? - PullRequest
1 голос
/ 27 декабря 2010

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

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

Учитывая ситуацию, когда вы просматриваете профиль пользователя и также хотитеотобразить все вопросы, отправленные пользователем, если вы используете QuestionsRepository из UsersRepository для заполнения массива user.Questions?

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

Например, UsersRepository выбирает все вопросы пользователей из QuestionsRepositiory, который для каждого вопроса выбирает пользовательские данные, используя экземпляр UsersRepository.и т. д.

Теперь давайте возьмем обратное (которое я только что немного коснулся).Чтобы перечислить все вопросы, мы будем использовать QuestionsRepository и вызывать метод GetAll() (или аналогичный).В этом листинге мы хотим отобразить информацию о пользователе, поэтому нам нужно извлечь ее из базы данных.

В идеале в этой ситуации мы хотели бы выполнить объединение вопросов с пользователями, а не получать все вопросы.и итерируя по ним, выбирая пользователя каждый раз, давая нам ситуацию N + 1 и массу ненужных поездок в базу данных.

Разрешено ли QuestionsRespository создавать экземпляр Users для выполненияприсоединиться? или нужно использовать UsersRepository, предотвращая одноразовое посещение базы данных.

Очевидным последствием этого является то, что вам дается тег и вам необходимо отобразить все Вопросы и их пользователей. Должен ли TagsRepository использовать QuestionsRespository для получения всех вопросов, где tag LIKE 'tag-name', который, в свою очередь, использует UsersRepository для получения информации о пользователе для каждого вопроса? или TagsRepository разрешено создавать Questions и Users для заполнения графа объектов?

1 Ответ

2 голосов
/ 27 декабря 2010

Попробуйте рассмотреть возможность использования репозиториев как таковых только для изменения данных (команд) и наличия отдельного сервиса / «репозитория чтения» для операций запросов, которые доступны только для чтения, и обходят обычные репозитории, переходят прямо в базу данных, читают данные, используя SQL запросы оптимизированы для конкретного случая. Я бы по-прежнему использовал обычные репозитории, когда вам нужна информация, которую вы легко можете получить с помощью репозитория (т. Е. Отображая сведения об одном пользователе), но пользуйтесь услугой только для чтения для более сложных сценариев (т. Е. На экране, который показывает некоторую сводку, объединяющую данные более сложные корни довольно сложным способом). Однако обязательно ВСЕГДА используйте репозитории для изменения данных.

В этом вы можете пойти еще дальше и взглянуть на шаблон под названием CQRS - Разделение ответственности по запросам команд ( www.cqrsinfo.com ), который в основном заключается в полном разделении частей приложения, изменяющих состояние приложения и части приложения, которые читают / запрашивают состояние приложения), хотя требуется некоторое время, чтобы понять его. (Обратите внимание, что CQRS отличается от CQS).

...