【问题标题】:What should be CRUD?什么应该是 CRUD?
【发布时间】:2014-08-20 06:47:18
【问题描述】:

我阅读了很多关于 CRUD 的文档,但我仍然不明白究竟什么应该是 CRUDable!似乎大多数人都在谈论 CRUD 实体,但他们的架构并没有在他们的实体中显示任何创建、读取、更新或删除方法。他们在一个单独的类中实现这些 CRUD 操作。我喜欢将这类类称为 CRUD 控制器。

使用 CRUD 控制器创建 POCO 实体是否正确?什么应该是 CRUD?

【问题讨论】:

  • 当然,对象本身不应该以持久的方式创建/更新/读取/删除其他对象——这不是它的责任。但是你不会调用 thing 来完成所有这些 CRUD 控制器 - 你通常称之为 Repository ^^ ...但我不得到你的(唯一?)问题:“什么是 CreateReadUpdateDelete?” ....

标签: c# entity-framework crud


【解决方案1】:

我认为您应该有一个执行 CRUD 操作的存储库。

然后控制器应该调用存储库中适当的 CRUD 方法,可能通过中间服务层。

详细了解存储库模式 herehere

【讨论】:

  • 我喜欢你的第二个链接。谢谢你。还有一个问题:我可以创建一个管理两个 POCO 实体的存储库吗?
  • 当然可以。通常,您会将相关实体组合在一起,并为这些实体提供一个存储库。或者每个聚合根有一个回购。您不需要每个实体一个 repo(尽管如果对您有意义的话,您可以这样做)。
【解决方案2】:

这些类通常称为存储库。存储库通过添加、更新、删除和检索一个或多个实体的方式提供对实体的访问。因此存储库创建、读取、更新和删除 (CRUD)。

当使用数据库时,您的 POCO 通常是您的数据库实体转换成的对象,例如在存储库中使用 AutoMapper。

【讨论】:

    【解决方案3】:

    在架构方面,CRUD 意味着您拥有没有业务规则的实体。这些实体最多有一些简单的验证。当您拥有这种实体时,您会说 CRUD,因为您可以修改数据而无需担心其他任何事情(除了验证)。例如,这可用于维护联系人列表:姓名 + 电话号码。 + 地址:最多可以验证姓名不为空,电话号码不为空。有效,地址有效。但是里面没有业务规则。

    如果涉及业务规则,则应避免使用 CRUD 以确保遵守业务规则。例如,您不应该允许对订单详细信息进行 CRUD,因为涉及到业务规则:如果订单已经支付或发送,或已确认给客户,您可能无法更改订单详细信息。此外,总订单金额取决于订单详情。在这种情况下,您应该将订单及其详细信息作为一个整体使用,并一次读取/写入/更新它。 (在 DDD 中,这称为“聚合”)。

    谈论 CRUD 不是你如何实现它的问题(存储库、像 DbContext 或 NHibernate 之类的 ORM,或者你想使用什么),而是一个更哲学的问题。

    实施 CRUD 比实施任何其他涉及业务规则的架构(例如 DDD)要快得多。如果您可以对实体使用 CRUD,建议您使用它,但不要在其他情况下使用。

    至于你的评论:

    但他们的架构并未在其实体中显示任何创建、读取、更新或删除方法

    这很自然...例如,您可以使用 EF 进行 CRUD,而无需显式声明 CRUD 方法。在上下文中创建一个实体,或者删除它或修改它,CRUD 操作将在 SaveChanges 上隐式执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 2012-07-02
      • 2017-08-23
      • 1970-01-01
      相关资源
      最近更新 更多