C# - 域驱动设计 - DTO过时映射到数据库

时间:2017-07-21 10:40:38

标签: c# entity-framework domain-driven-design dapper

我正在设计项目结构,遵循DDD artchitecture& C#技术。 我面临一个日期DTO映射到域模型的问题,并将出日期数据持久化到数据库。

情景如下

我有2个分布式客户端(桌面)获取学生ID = 1

的数据
  1. 服务器返回DTO for Student的ID = 1,其中包含以下信息:客户端1& 2那样: 学生:

    • ID = 1
    • 全名:约翰;
    • 电话号码:01234;
  2. 客户1获取DTO并将此学生的电话号码更新为:56789 并允许保存操作 ---> 数据库已将新手机值保持为56789.

  3. 客户端2获取DTO并将此学生的全名更新为:Peter 并允许保存操作 ---> 数据库已经使用了新的全名:Peter和旧电话号码:01234(不期望的行为)

  4. 根本原因: - 执行保存操作时,客户端将修改后的DTO返回到服务器并映射到域模型。 DTO保留旧值(电话号码:01234)并将此值映射到域模型。

    请您告诉我一种方法,模式或技术来防止这个问题?这一点非常重要,因为应用程序可以让多个人同时修改相同的应用程序模型。

    非常感谢

1 个答案:

答案 0 :(得分:0)

它被称为并发问题。有很多方法可以解决它。例如,SQL Server或Oracle等RDMS产品具有内置的并发处理功能,可以提供帮助(检查数据库供应商的文档)。首先研究并使用它们,然后添加您喜欢的程序化方法。我已经在我支持的一些应用程序中看到了以下内容,每个应用程序都有自己的问题,因此您必须测试最适合您的应用程序以及用户操作方式的应用程序。

  • 一种方法是添加一个字段来存储记录的版本(时间戳)。当用户保存记录时,检查记录的数据库版本是否为<手头的版本。为了提高完整性,您还可以添加检查以比较旧值与当前值和新值。如果一切正常,请保存,否则,“拒绝”并让用户知道。
  • 另一种方法是将字段添加为锁定标志(用户ID +时间戳)。当用户请求编辑记录时,锁定标志会更新(使用用户的ID +当前时间)。在UI中,保存的用户ID“获胜”编辑模式,所有其他用户获得只读模式。当编辑用户从UI保存(或取消)时,将清除锁定标志,为新的编辑请求设置记录。专业:用户知道什么时候记录被谁锁定以及何时被锁定; Con:您需要添加功能以“锁定”锁定,或者让用户“抢夺/窃取”锁定。
  • 最后,该解决方案可以运行,用户可以分组处理预先分配的记录集合/范围(或按计划),而不会重叠。原始但有效!它依赖于用户行为,但在您整合应用程序的并发处理功能时,它可以是一个短期解决方案。在我支持的大多数应用程序中,这种方法的规划和实现最终成为用户的SOP,实际的程序化并发解决方案作为额外的“安全检查”,JIC。

还有很多其他方法,每种方式都有自己的问题。它们可以简单到复杂。例如,命名模式可以包括OCC,事件源和消息传递。无论如何,假设至少有一个请求可以赢得“先到先得”,并且所有其他请求都会得到相应的反应。

希望这有帮助!