3
我正在使用DDD体系结构的解决方案。我在我的ViewModel中有一个属性指向一个ValueObject,视图模型也实现了INotifyPropertyChanged接口。当用户在前端输入数据时,ValueObject的值将会改变。我遇到的问题是值对象被认为是不可变的。我该如何解决这个问题?先谢谢你。值对象和视图模型属性
我正在使用DDD体系结构的解决方案。我在我的ViewModel中有一个属性指向一个ValueObject,视图模型也实现了INotifyPropertyChanged接口。当用户在前端输入数据时,ValueObject的值将会改变。我遇到的问题是值对象被认为是不可变的。我该如何解决这个问题?先谢谢你。值对象和视图模型属性
如果您可以编辑某些东西,那么必须有一个可变的容器作为不可变的值。因此,你的viewmodel应该直接作用于可变容器而不是直接作用于不可变值。
整数是这种不可变值对象的示例:Int32
类型没有任何成员允许您更改对象的状态。你只能用代替一个整数,不能改变它。因此,对于一个整数视图模型是这样的:
public MutableIntegerViewModel
{
private readonly mutableInteger;
public MutableIntegerViewModel(MutableInteger mutableInteger)
{
this.mutableInteger = mutableInteger;
}
public string DisplayText
{
get
{
return this.mutableInteger.Value.ToString(
CultureInfo.CurrentCulture);
}
set
{
this.mutableInteger.Value =
Int32.Parse(value, CultureInfo.CurrentCulture);
}
}
}
哪里MutableInteger
仅仅是这样的:
public class MutableInteger
{
public int Value { get; set; }
}
我省略了错误处理和变更通知在这里,但希望你的想法。
此外,请注意,此示例与FirstName
和LastName
的Customer
类的典型示例并没有什么不同。字符串也是不可变的,所以我们再次有一个可变的容器,用于不可变的值。
我正在考虑与您在此处指定的解决方案相同的路径,但不幸的后果是它会在您的DDD模型上为此值对象设置一个通用容器,否则必须为每个对象创建一个新的ViewModel希望允许编辑相同值对象的容器。也许有一种方法可以将容器本身保留在ViewModel中,而不会使事情过于复杂...... – jpierson