在我的各种项目中,我实现了命令/查询分离模式,并使用NHibernate作为我的ORM。
一般情况下,我将命令和查询保存在与UserManagement
,TagManagement
,QuestionManagement
等特定活动相关的单独项目中。
我非常喜欢将所有内容很好地划分到这些存储库中,并且具有易于查找的功能。以这种方式做事当然有好处。
然而,我开始怀疑这个抽象对于基本查询的价值,特别是考虑到NHibernate本身已经提供了如此强大的抽象。在我的MVC控制器中考虑这个:
_nHibernateSession.Get<UserProfile>(_sessionData.UserId);
我可以将它抽象为UserManagement
存储库中的查询,但我不确定它提供的价值。
答案 0 :(得分: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/
答案 1 :(得分:2)
我更喜欢将所有查询保留在存储库中,如果需要进行大量不同的查询,可以公开实现IQueryable的存储库并包装session.Query of LINQ To Nhibernate,对HQL或Criteria有限制。
但对我来说,只有当你向其他人提供数据访问层并且你不会知道这些查询时,才有理由这样做。
您可以在我正在使用的DDD project上看到此示例。
答案 2 :(得分:1)
我强烈建议您在MVC控制器和NHibernate之间保持一定程度的抽象,特别是如果您需要对MVC控制器进行单元测试。如果没有存储库层,则创建需要模拟存储库层的单元测试要困难得多。