假设您有规范的客户域对象。您在三个不同的屏幕上显示客户:外部管理员、内部管理员和更新帐户。
进一步假设每个屏幕仅显示 Customer 对象中包含的所有数据的一个子集。
问题是:当 UI 从每个屏幕传回数据时(例如通过 DTO),它只包含完整客户域对象的子集。因此,当您将该 DTO 发送到客户工厂以重新创建客户对象时,您只有客户的一部分。
然后您将此客户发送到您的客户存储库以保存它,一堆数据将被清除,因为它不存在。悲剧接踵而至。
所以问题是:你将如何处理这个问题?
我的一些想法:
在存储库中包含一个参数,指示要更新客户的哪一部分,并忽略其他部分
当您加载客户时,将其保存在静态内存中、会话中或任何地方,然后当您从 UI 接收到其中一个 DTO 时,仅更新与 DTO 相关的部分
IMO,这两者都是kludges。还有其他更好的想法吗?
@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 更新为空白,或者是否应该忽略它们。