【问题标题】:What is the best way to Update only 1 field of a big Business Object inside a transaction?在事务中仅更新大业务对象的 1 个字段的最佳方法是什么?
【发布时间】:2011-03-31 22:44:16
【问题描述】:

我处于必须执行交易主详细信息记录的情况(删除上一个详细信息,插入新详细信息,更新主状态

  1. 主业务对象有 20 个 字段
  2. 详细信息业务对象 只有 4 个字段

现在我只需要更新主表中的 1 个字段和详细表中的 4 个字段以进行插入。

如果我初始化一个新的主对象,19 个字段被浪费在一个简单的更新上。我该怎么做才能有效地处理这种情况?

我可以创建一个新对象并仅从我的主业务对象继承一个字段吗?如果您建议我使用 DTO 或具有继承性的东西,请给我一个工作示例。谢谢。

【问题讨论】:

    标签: c# asp.net architecture business-objects


    【解决方案1】:

    使用这 4 个字段创建 DTO。 UI 会将此 DTO 发送到业务层,业务层将使用新值来修改业务对象。比您持久化修改后的业务对象。

    【讨论】:

    • 对不起,我完全是这个持久层的新手。 DTO 不会被带到单独的数据库层进行更新吗?另外,修改业务对象是什么意思?如果我将它放在 DTO 中,我可能不会弄乱主业务对象,因为这意味着初始化所有字段。
    【解决方案2】:

    我猜你的意思是公开这 4 个字段,而不是继承它们,因为你不能真正继承字段,只能继承一个类。

    您可以制作一个更小、更简单的“更新对象”,但只有在您的模型中逻辑上也存在这个更小的对象时,我才会这样做。理想情况下,您真的不想创建特殊对象来仅更新部分业务对象。相反,持久层的任务是足够聪明地知道哪些字段已更改并采取相应措施(即仅更新这些字段)。

    总之:

    • 仅当更新对象也是域模型的逻辑部分时才创建更新对象
    • 相信您的持久层,看看发生了什么变化。

    【讨论】:

    • 感谢山姆的回复。我可以用 4 个字段创建一个更简单的业务对象,但它会创建冗余(两个对象中的字段相同)。 “在您的模型中逻辑存在”是什么意思?在主子中,每当子更新时,我都必须更新主中的“最后更新字段”。
    • 我的意思是,在理想的设计世界中,您的对象将根据您的“现实世界”业务概念而不是您的技术要求进行建模。这当然不是 100% 可能的(一些持久层会要求你 - 例如 - 用一些属性来装饰你的业务对象,以指示它们应该如何保存到数据库中)。即便如此,我不是使用“缩减”对象的忠实粉丝,例外情况可能是如果您必须进行大量序列化(例如 wcf 服务)并且序列化所有这些空字段会对您的性能产​​生影响.
    • 嗯,谢谢 Sam,这确实有道理。我从来没有想过序列化,但在我的情况下,它不是必需的。是否建议将我的大型业务对象分解为小对象并在需要时返回它们的组合?这会让我的工作更轻松。
    • 您可以这样做,但如果您必须始终将业务对象拆分为更小的(逻辑)对象,也许您应该考虑到您的业务对象设计得太宽泛而无法使用?在这种情况下,将其拆分为更小的对象确实是有意义的。
    • 谢谢 Sam,我暂时将业务对象拆分为 2 个对象。我会等待更多建议一段时间,如果没有,我会将您的建议标记为答案。
    猜你喜欢
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    相关资源
    最近更新 更多