【问题标题】:Repository Pattern存储库模式
【发布时间】:2010-08-07 16:10:55
【问题描述】:

我有一个关于存储库使用的快速问题。但是最好的提问方式是显示一些伪代码,你们告诉我结果应该是什么

  • 从存储库中获取 ID 为 1 的记录(假设存在)

  • 编辑几个属性

  • 再次在存储库中查询 ID 为 1 的项目

  • 结果 = ??

我应该获取具有更新值的对象还是没有(原始状态)的对象,请记住,自从更新属性值(第 2 步)以来,我没有告诉存储库更新此记录。

我想我应该得到一份原始项目的副本,而不是对已编辑版本的参考。

请告诉我什么是正确的。

干杯

【问题讨论】:

    标签: repository-pattern


    【解决方案1】:

    存储库模式的行为类似于对象的集合,所以理想情况下,我认为它应该返回相同的对象实例,其中包含更新。

    通常在某处有一个身份映射,因此您的存储库可以跟踪已加载的内容。使用身份映射,当您获取具有相同 Id 的对象时,无论多少次,您都应该始终取回已加载的对象。这就是所有更复杂的 ORM 的工作方式,通常是一种很好的做法。身份映射有助于在您进行同一事务时保持事物同步,并为您节省一些数据访问权限。

    NHibernate 的会话有一个身份映射,它会跟踪它,因此您不必担心尝试在您的存储库中实现您自己的。此外,如果您想加载另一个实例而不进行更改跟踪,我相信您可以使用 NHibernate 的无状态会话,但我对此并不积极。

    【讨论】:

    • 有道理,但对于我们这些习惯于以旧时尚方式做事的人来说,最初是违反直觉的。我想不小心使用静态 DataContext 是在你的应用程序中得到一些疯狂数据的好方法。
    • 如前所述,Identity Map 正在为您解决此问题。如果您使用完全独立的 DbContext 实例,您将看不到该行为,除非您首先从一个保存更改,然后从另一个请求对象。它的工作方式是设计使然。
    【解决方案2】:

    从您过去的问题来看,我假设您使用的是 LINQ/C#?

    如果你使用的是DataContext,而你还没有调用SubmitChanges(),那么你应该取回原始未更改的对象。

    刚刚测试过。我错了,你取回改变的对象。
    如果您在DataContext 上设置ObjectTrackingEnabled = false,您将获得未更改的对象。

    【讨论】:

    • 嘿,猜得好。我首先使用实体​​框架代码,但在设计 TestDataContext(将实体存储在内存中)时,它实际上让我思考了所需的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多