2010-03-22 124 views
3

我正在使用DDD体系结构的解决方案。我在我的ViewModel中有一个属性指向一个ValueObject,视图模型也实现了INotifyPropertyChanged接口。当用户在前端输入数据时,ValueObject的值将会改变。我遇到的问题是值对象被认为是不可变的。我该如何解决这个问题?先谢谢你。值对象和视图模型属性

回答

2

如果您可以编辑某些东西,那么必须有一个可变的容器作为不可变的值。因此,你的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; } 
} 

我省略了错误处理和变更通知在这里,但希望你的想法。

此外,请注意,此示例与FirstNameLastNameCustomer类的典型示例并没有什么不同。字符串也是不可变的,所以我们再次有一个可变的容器,用于不可变的值。

+0

我正在考虑与您在此处指定的解决方案相同的路径,但不幸的后果是它会在您的DDD模型上为此值对象设置一个通用容器,否则必须为每个对象创建一个新的ViewModel希望允许编辑相同值对象的容器。也许有一种方法可以将容器本身保留在ViewModel中,而不会使事情过于复杂...... – jpierson