代码之家  ›  专栏  ›  技术社区  ›  Chris

面向对象设计:保存复杂对象

oop
  •  1
  • Chris  · 技术社区  · 16 年前

    我有一个复杂的域模型建立在遗留系统之上,我为这个遗留系统建立了大多数“get”方法——通常只是通过传递数据库主键id。很简单。我现在很好奇如何在数据库中创建新对象并用新数据保存现有对象,并希望确保覆盖所有基础。

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

    另一种方法是在处理它们的服务对象上公开“CreateNew”和“Save”方法,但是这类方法的参数列表会非常复杂。

    我在考虑要求“CreateNew”和“Save”接受命令对象之类的内容,这样他们就可以创建和传递命令对象,从而准确地知道需要哪些数据,以及无法控制哪些数据。我在报纸上读到 command pattern

    我应该考虑哪些因素来决定一种方法?这是C#3.5,如果考虑到这一点的话。

    2 回复  |  直到 16 年前
        1
  •  1
  •   user151323 user151323    16 年前

    您可以使所有对象都公开同一个方法,将其称为AttemptSave,并且对父对象调用此方法将导致它调用所有子对象的那些方法。

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

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

        2
  •  1
  •   Community Mohan Dere    8 年前

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

    似乎每隔几天,就会有新的人要求提供.NETORM建议,因此有大量的堆栈溢出主题可以帮助指导您。例如:

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

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