如何保持域和演示对象之间的对应关系

问题描述

这个问题困扰了我一段时间。当我与演示文稿中的对象进行交互时,如何找到与之相关的域/业务对象?

我的域/业务中有Shape类,我使用WPF在屏幕上绘制这些Shape(演示文稿)。例如,我在 Domain 中有一个名为Lineshape的类,然后我使用System.Windows.Shapes.Line在WPF中绘制该类。

在这是我的问题,如何保持域层中的对象与业务层之间的对应关系。假设用户点击了WPF中的特定System.Windows.Shapes.Line,UI触发了一个事件,并向我提供了选定的System.Windows.Shapes.Line,现在我该如何识别域中选定的{{ 1}}代表?

我已经考虑过几种方法,但是它们似乎并不优雅,特别是对于更大,更复杂的对象模型而言。

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

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

这里有什么最佳做法可遵循吗?

enter image description here

解决方法

为Presentation和Domain中的对象都使用一个ID。这听起来像 我有点奇怪,因为据我所知,我们不应 将ID用于DDD中的每个对象,仅用于实体。

也许您正在查看的是地址而不是ID。甚至必须以某种方式处理值,以便可以将其替换。这样的地址可以是类属性的名称,数组的索引等。

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

但是,请注意,只有在使用预期的图形版本时,该地址才有效。

此外,您还可以使用所有形状属性的组合来标识要修改的给定形状。如果您有两个相同的形状(相同的形状,位置,层等),那么重新成形哪个形状有关系吗?最终的图纸看起来完全一样。

最后,如果使您更轻松地将形状建模为实体并为其指定ID,那么即使您可能并不在乎特定形状的整个生命周期,这也许也是正确的模型。

最后,请注意,如果形状是值,则由于值是不可变的,因此您不可能在视图模型中保留对其的引用。同样,如果形状是实体,但图形是“聚合根”,则形状实体不应在根外部访问。因此,如果它是AR,则最有可能仅在视图模型中引用域的Shape(除非您违反可见性规则,但仍通过根处理事件强制执行不变式)。另外请注意,如果您的域模型位于另一层上,则地址/ ID引用可能是唯一的选择。

,

您问了一个比较广泛的问题,所以我将给出我认为是正确但普遍的答案。

在WPF中,一种或多种方式,屏幕上的控件将具有DataContext。一般来说,DataContext应该是您想要保留的对象。

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

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

如果您使用的是事件,则可以在事件的代码隐藏中直接访问DataContext属性,将其强制转换为所需的类型,然后退出。

如果您正在使用命令,那么通常它们首先是viewmodel对象的一部分,因此它们可以直接对拥有它们的对象进行操作。