Разделение команд / запросов при использовании ORM

В своих проектах я использую шаблон разделения команд и запросов и использую NHibernate в качестве ORM.

В общем, я храню свои команды и запросы в отдельных проектах, относящихся к определенному набору действий, таких как UserManagement, TagManagement, QuestionManagement и т.п.

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

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

Учтите это в моем контроллере MVC:

_nHibernateSession.Get<UserProfile>(_sessionData.UserId);

Я мог бы абстрагировать это в запрос в UserManagement хранилище, но я не уверен, какую ценность это предлагает.

Как вы думаете? Будете ли вы хранить все в парадигме команда / запрос или будете использовать сеанс nhibernate непосредственно в ваших контроллерах для простых запросов, подобных этому?

3 ответа

Обычно я не использую репозитории, потому что я думаю, что они добавляют слишком много абстракции в мой код. Я предпочитаю View Model, которая построена непосредственно в слое Service / Controller. Если я хочу написать модульный тест, я могу написать его для службы или контроллера. Если вы хотите повторно использовать некоторые критерии запроса, просто напишите метод расширения:

    public static IQueryable<User> Administrators(this IQueryable<User> users)
    {
        return users.Where(x => x.Role.Id == Role.Const.Admin);
    }

В связи с этим я рекомендую эти статьи: http://ayende.com/blog/3955/repository-is-the-new-singleton http://www.planetgeek.ch/2012/05/05/what-is-that-all-about-the-repository-anti-pattern/

Я предпочитаю хранить все запросы в репозитории, если вам нужно сделать много разных запросов, вы можете предоставить репозиторий, который реализует сеанс IQueryable и wrap. Запрос LINQ To Nhibernate, который имеет ограничения относительно HQL или Критерии.

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

Вы можете увидеть пример этого в проекте DDD, над которым я работаю.

Я настоятельно рекомендую вам поддерживать уровень абстракции между вашим контроллером MVC и NHibernate, особенно если вам нужно выполнить модульное тестирование вашего контроллера MVC. Без уровня хранилища гораздо сложнее создать модульные тесты, которые требуют проверки уровня хранилища.

Другие вопросы по тегам