【发布时间】:2020-12-27 13:19:11
【问题描述】:
这个问题让我困惑了一段时间。当我与 Presentation 中的对象交互时,如何找出这与哪个 Domain/Business 对象相关?
我的 域/业务 中有 Shape 类,我使用 WPF 在屏幕上绘制这些 Shapes(Presentation)。例如,我的 Domain 中有一个名为 LineShape 的类,然后我使用 System.Windows.Shapes.Line 在 WPF 中绘制它。
现在这是我的问题,我如何保持领域层和业务层中的对象之间的对应关系。假设用户在 WPF 中单击特定的System.Windows.Shapes.Line,UI 触发一个事件并给我选择的System.Windows.Shapes.Line,我现在如何识别我的域中选择的System.Windows.Shapes.Line 代表哪个LineShape?
我曾想过一些方法,但它们看起来并不优雅,尤其是对于更大更复杂的对象模型。
-
使用字典来保存 Presentation 和 Domain 对象之间的对应关系。在这种方法中,当用户在 UI 中选择一个
System.Windows.Shapes.Line时,我可以在字典中的 domain 中查找对应的LineShape。 -
对 Presentations 和 Domain 中的对象都使用 Id。这听起来有点奇怪,因为据我所知,我们不应该对 DDD 中的每个对象都使用 Id,而只是对实体使用。
这里有什么可以遵循的最佳实践吗?
【问题讨论】:
-
您将通过 ItemsControl(或 ListBox 等派生控件)进行绘图,它的 ItemsSource 属性绑定到域对象的集合。表示对象将由 DataTemplates 创建,或者由它们的 DataType 自动选择,或者由 ItemsControl ItemTemplate 或 ItemTemplateSelector 创建。就像例如这个:stackoverflow.com/a/40190793/1136211
-
@Clemens 谢谢Clemens,我也想到了那个,使它类似于显示字符串列表。当然,我上面提供的示例已针对该问题进行了简化。在更复杂的情况下,我无法绑定到 ItemsSource,例如图形 API 可能不同于 WPF,它不允许 ItemsSource。或者在某些情况下,DTO 介于表示和域之间。这些案例怎么办?那么我怎么知道现在在我的 ItemsSource 中的 DTO 属于哪个域对象?谢谢你。
-
@Clemens 在您提供的链接中,ShapeData 如何链接到 Domain 中的实际 Shape 类?假设用户在 Presentation 中选择了一个 Shape 并将其删除。现在从您的方法中,我知道它对应于哪个 ShapeData,但是我怎么知道这个 ShapeData 链接到域中的哪个形状? ShapeData 是否应该再次引用域中的实际形状?还是有身份证?还是...?
-
“ShapeData 是否应该再次引用 Domain 中的实际 Shape?”- 是的,这是视图模型和模型之间的常用引用。
-
@Clemens 感谢您的澄清。如果 ViewModel 和 Model 之间存在 DTO,那么 ViewModel 是否应该引用 DTO,然后这些 DTO 是否引用 Model?这部分对我来说似乎很奇怪,因为我没有看到 DTO 引用模型的任何地方。那我们如何找到链接呢?
标签: c# wpf domain-driven-design presentation business-logic-layer