【问题标题】:Object-oriented design: Saving complex objects面向对象设计:保存复杂对象
【发布时间】:2009-11-12 17:05:05
【问题描述】:

我有一个构建在遗留系统之上的复杂域模型,我已经为其构建了大部分“get”方法 - 通常只是通过传递数据库主键 ID。很容易。我现在很好奇如何处理在数据库中创建新对象并用新数据保存现有对象的任务,并希望确保我涵盖了所有基础。

整个项目中对应于数据库中实体的主要领域对象编号在 20-25 左右。大约需要保存 10 个左右(其余的只是用于支持数据,不需要用户更新)。要保存的对象具有复杂的依赖关系 - 对象 A 有一个对象 B 的列表,其中包含对象 C、D 和 E,例如,当原始对象 A 存在时,所有这些对象都可能需要保存。

我想构建它以便 UI 开发人员易于使用,但也强制只保存有效数据(假设对象 B 可能无法保存,除非对象 C 处于有效状态)。这让我不敢让他们从头开始创建一个对象并尝试保存它——我想遵循对象只能在有效状态下存活的原则。

另一种选择是在处理它们的服务对象上公开“CreateNew”和“Save”方法,但是这些方法的参数列表会很糟糕。

我正在考虑要求“CreateNew”和“Save”接受他们可以创建和传递的命令对象之类的东西,以便他们确切地知道需要哪些数据以及他们无法控制哪些数据。我阅读了command pattern,但我不需要它提供的任何主要福利。

在决定方法时我应该考虑哪些因素?这是 C#3.5,如果有的话。

【问题讨论】:

    标签: oop


    【解决方案1】:

    你可以让你的对象都暴露同一个方法,调用它AttemptSave,在父对象上调用这个方法会导致它级联调用所有子对象的那些方法。

    该方法可以返回一个指示操作成功的布尔值。无需抛出异常,方便 UI 开发人员使用。

    然后公开一个方法GetValidationErrors。如果 AttemptSave 返回 false,则 UI 开发人员应调用此方法来检索和显示错误。

    或者,您可以添加一个验证方法 Validate,它将预先检查对象层次结构。您可以通过 GetValidationErrors 返回验证错误。然后将执行对 AttemptSave 的调用。如果失败,您可以使用 GetOperationErrors 返回错误。

    SQL 哲学中的一些东西。无论您的查询是否成功,您都可以随时查看@@ROWCOUNT 以了解查询是否至少完成了部分工作。

    【讨论】:

      【解决方案2】:

      您应该研究一下流行的 .NET 对象关系映射框架。很多人以前都处理过这个问题,其中一些最聪明的人已经与我们分享了他们的劳动成果。它们拥有大量功能,并且最受欢迎的功能经过严格测试。

      似乎每隔几天,就会有新人询问 .NET ORM 建议,因此有很多 Stack Overflow 主题可以帮助指导您。例如:

      (如果您搜索“ORM”和“.NET”,您会找到更多匹配项。)

      在典型用法中,UI 开发人员只处理高级父对象(在领域驱动设计语言中称为“聚合根”)。他们将 ORM 用作Repository,它确保给定 Save 中的所有操作都捆绑在合理的事务中。 (您仍然需要在域对象中根据业务规则强制执行有效性。)

      以下是 UI 代码的简化视图:

      // Given an IRepository implemented by your ORM,
      ICustomer customer = repository.Get(customerId);
      
      // ... do stuff to customer and its child objects ...
      
      repository.Save(customer);
      

      【讨论】:

      • 我想过检查它们,但是“遗留系统”部分出现了一个问题:虽然我可以随意从数据库中读取,但保存时必须通过网络服务。遗憾的是,它不能直接写入数据库。
      • 嗯,很不幸。我对此没有任何经验,尽管有人在这里提出了一个问题,这可能很有趣:stackoverflow.com/questions/1202178/….
      • 不错的发现,一直在寻找这样的链接。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      相关资源
      最近更新 更多