c# - 使用 ORM 时的命令/查询分离

标签 c# asp.net-mvc nhibernate command-query-separation

在我的各种项目中,我实现了命令/查询分离模式并使用 NHibernate 作为我的 ORM。

一般来说,我将我的命令和查询保存在与特定事件集相关的单独项目中,例如 UserManagementTagManagementQuestionManagement 等.

我非常喜欢将所有内容很好地划分到这些存储库中,这些存储库具有易于查找的功能。以这种方式做事当然有好处。

然而,我开始怀疑这种抽象对于基本查询的值(value),特别是考虑到 NHibernate 本身已经提供了如此强大的抽象。

在我的 MVC Controller 中考虑这个:

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

我可以将其抽象为 UserManagement 存储库中的查询,但我不确定它提供了什么值(value)。

你怎么看?您会将所有内容都保留在命令/查询范例中,还是会直接在您的 Controller 中使用 nhibernate session 来处理像这样的简单请求?

最佳答案

通常我不使用存储库,因为我认为它们在我的代码中添加了太多抽象。我更喜欢直接在服务/ Controller 层构建的 View 模型。如果我想编写单元测试,我可以针对服务或 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/

关于c# - 使用 ORM 时的命令/查询分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10849706/

相关文章:

.net - SignalR 不使用 Web 套接字

asp.net-mvc - 使用 MVC 应用程序中的 Kentor 身份验证服务库将 Google 实现为身份提供者(IDP)?

c# - 自定义属性 - 为枚举获取 "not a valid named attribute argument"

NHibernate 多个数据库提供者

c# - 我的触发器在更新面板中不起作用?

c# - 针对关键字 var 评估的不同类型

nhibernate - 在 session.GetNamedQuery() 上获取 "Named Query Not Know"错误

nhibernate - (流畅)NHibernate : One entity composed of fields from different tables

c# - 尝试删除字符串的最后一个字符时出错

c# - 当 YAML 文档的字段类型不正确时,YamlDotNet 反序列化抛出异常