我们的领域模型中有很多不可变的值对象,其中一个例子是位置,由纬度、经度和高度定义。
/// <remarks>When I grow up I want to be an F# record.</remarks>
public class Position
{
public double Latitude
{
get;
private set;
}
// snip
public Position(double latitude, double longitude, double height)
{
Latitude = latitude;
// snip
}
}
允许编辑位置的明显方法是构建一个具有 getter和setter 的 ViewModel,以及一个 ToPosition() 方法来提取经过验证的不可变位置实例。虽然这个解决方案没问题,但它会导致大量重复代码,尤其是 XAML。
所讨论的值对象由三到五个属性组成,这些属性通常是 X、Y、Z 和一些辅助材料的变体。鉴于此,我曾考虑创建三个 ViewModel 来处理各种可能性,其中每个 ViewModel 都需要为每个属性的值公开属性以及为每个标签显示的描述(例如“纬度”)。
更进一步,似乎我可以将其简化为一个通用的 ViewModel,它可以处理 N 个属性并使用反射将所有内容连接起来。类似于属性网格的东西,但用于不可变对象。属性网格的一个问题是我希望能够更改外观,以便拥有标签和文本框,例如:
Latitude: [ 32 ] <- TextBox
Longitude: [ 115 ]
Height: [ 12 ]
或将其放在 DataGrid 中,例如:
Latitude | Longitude | Height
32 115 12
所以我的问题是:
你能想出一个优雅的方法来解决这个问题吗?有没有这样做的图书馆或关于类似事情的文章?
我主要在寻找:
- 尽量减少代码重复
- 易于添加新的值对象类型
- 可以通过某种验证进行扩展