我们的领域模型中有许多不可变的值对象,例如位置,由纬度、经度和高度定义。
/// <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
}
}
显然,允许编辑位置的方法是构建一个ViewModel,它具有getter和setter,以及一个ToPosition()方法来提取经过验证的不可变位置实例。虽然这种解决方案可以接受,但会导致大量重复的代码,特别是在XAML中。所涉及到的值对象包括三到五个属性,通常是一些变体,如X、Y、Z和一些辅助内容。考虑到这一点,我曾考虑创建三个ViewModel来处理各种可能性,其中每个ViewModel都需要公开每个属性的值以及每个标签要显示的描述(例如“纬度”)的属性。
进一步地,似乎我可以简化为一个通用的ViewModel,可以处理N个属性,并使用反射连接所有内容。类似于属性网格,但用于不可变对象。 属性网格的一个问题是我想能够更改外观,以便我可以拥有标签和文本框,例如:
Latitude: [ 32 ] <- TextBox
Longitude: [ 115 ]
Height: [ 12 ]
或者将其放入DataGrid中,例如:
Latitude | Longitude | Height
32 115 12
所以我的问题是:
你能想到一个优雅的方法来解决这个问题吗?是否有任何可以做到这一点或类似内容的库或文章?
我主要寻找以下内容:
- 最小化代码重复
- 易于添加新的值对象类型
- 可以通过某种形式的验证进行扩展