如何保持 Domain 和 Presentation 对象之间的对应关系

How to keep correspondence between Domain and Presentation objects

这个问题困扰了我一段时间。当我与 Presentation 中的对象交互时,如何找出它与哪个 Domain/Business 对象相关?

我的 Domain/Business 中有形状 classes,我使用 WPF 在屏幕上绘制这些形状 (Presentation).因此,例如,我在 Domain 中有一个名为 LineShape 的 class,然后我使用 System.Windows.Shapes.Line.

在 WPF 中绘制它

下面是我的问题,如何保持领域层和业务层对象之间的对应关系。假设用户单击 WPF 中的特定 System.Windows.Shapes.Line,UI 触发一个事件并为我提供选定的 System.Windows.Shapes.Line,我现在如何识别我的域中的哪个 LineShape所选 System.Windows.Shapes.Line 代表?

想过几种方法,但都不太优雅,特别是对于更大更复杂的对象模型。

  1. 使用保留 Presentation 和 Domain 对象之间对应关系的字典。在这个方法中,当用户在UI中选择一个System.Windows.Shapes.Line时,我可以在字典中的域LineShape中查找对应的LineShape

  2. 对 Presentations 和 Domain 中的对象使用 Id。这对我来说听起来有点奇怪,因为据我所知,我们不应该将 Id 用于 DDD 中的每个对象,而只是用于实体。

这里有什么最佳实践可以遵循吗?

您问的问题有点笼统,所以我会给出我认为正确但笼统的答案。

在 WPF 中,无论如何,on-screen 控件将具有 DataContext。 DataContext一般来说应该是你想获取的对象。

无论您使用何种方法填充所有屏幕控件,或多或少都应该是这种情况。

创建特殊的视图模型 类 可能适合您的程序,它在您的“本机”数据对象之间架起桥梁,在这种情况下,这些视图模型 类 将被设置为 DataContext 对象。如果您不需要视图模型,那么本机数据对象将扮演那个角色。

如果您正在使用事件,那么在事件的 code-behind 中您可以直接访问 DataContext 属性,将其转换为预期的类型,然后开始。

如果您正在使用命令,那么它们通常首先是视图模型对象的一部分,因此它们可以直接作用于拥有它们的对象。

Use an Id for objects both in Presentations and Domain. This sounds a bit strange to me, because as far as I am aware, we are not supposed to use Id for every object in DDD, just for entities.

也许您会查看地址而不是 ID。即使是价值观也必须以某种方式得到解决,以便它们可以被替换。这样的地址可能是class 属性的名称,数组的索引等

如果您将整个绘图视为形状值的集合,那么您始终可以使用形状的索引作为地址,从而允许替换集合中的特定形状值。

但是,请注意,该地址仅在您使用预期绘图版本时有效。

此外,您还可以使用所有形状属性的组合来识别要修改的给定形状。如果你有两个相同的形状(相同的形状、位置、层等),你选择哪一个很重要re-shape?最终的图纸看起来完全一样。

最后,如果将形状建模为实体并为它们提供 ID 让您的生活更轻松,那么也许这也是正确的模型,即使您可能不关心特定形状的整个生命周期。

最后,请注意,如果形状是值,那么您不可能在视图模型中保留对它们的引用,因为值是不可变的。此外,如果形状是实体,但绘图是聚合根,则不应在根外部访问形状实体。因此,如果它是 AR,则很可能只有在视图模型中引用域的 Shape 才有意义(除非您违反可见性规则,但仍通过 root-handled 事件强制执行不变量)。另请注意,如果您的域模型位于另一层,则 address/ID 引用可能是唯一的选择。