假设您有规范的 Customer 域对象。您可以在三个不同的屏幕上显示客户:外部管理员、内部管理员和更新帐户。

进一步假设每个屏幕仅显示 Customer 对象中包含的所有数据的一个子集。

问题是:当 UI 从每个屏幕传回数据时(例如通过 DTO),它只包含完整客户域对象的子集。因此,当您将该 DTO 发送到客户工厂以重新创建客户对象时,您只有客户的一部分。

然后你把这个 Customer 发送到你的 Customer Repository 来保存它,一堆数据会因为它不存在而被清除。悲剧接踵而至。

所以问题是:你会如何处理这个问题?

我的一些想法:

  • 包含一个参数
    指示哪个部分的存储库
    客户更新,并忽略
    其他
  • 当你加载 Customer 时,将它保存在静态内存中,或者在 session 中,或者任何地方,然后当你从 UI 收到一个 DTO 时,只更新与 DTO 相关的部分

  • IMO,这两个都是杂七杂八的。还有其他更好的想法吗?

    @chadmyers:这是问题所在。

    实体具有属性 A、B、C 和 D。

    DTO #1 包含 B 和 C 的属性。

    DTO #2 包含 C 和 D 的属性。

    UI 要求 DTO #1,您从存储库加载实体,将其转换为 DTO #1,仅填写 B 和 C,并将其提供给 UI。

    现在 UI 更新 B 并将 DTO 发回。您重新创建实体,它只填充了 B 和 C,因为这是 DTO 中包含的全部内容。

    现在您要保存实体,其中只填充了 B 和 C,而 A 和 D 为空/空白。存储库无法知道它是否应该将持久性中的 A 和 D 更新为空白,或者是否应该忽略它们。

    最佳答案

    收到 DTO 后,我将使用工厂从存储库加载完整的客户对象。之后,您只能更新 DTO 中指定的那些字段。

    例如,这还允许您通过检查上次更新的时间戳对您的客户应用一些乐观并发。

    关于repository-pattern - 从多个 DTO 构建域对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/231607/

    10-13 07:34