【问题标题】:Value Object and View Model Property值对象和视图模型属性
【发布时间】:2010-03-22 04:33:52
【问题描述】:

我正在研究一种将 DDD 用于架构的解决方案。我的 ViewModel 中有一个指向 ValueObject 的属性,该视图模型还实现了 INotifyPropertyChanged 接口。 ValueObject 的值会随着用户在前端输入数据而改变。我遇到的问题是值对象应该是不可变的。我该如何解决这个问题?提前谢谢你。

【问题讨论】:

    标签: wpf mvvm domain-driven-design inotifypropertychanged


    【解决方案1】:

    如果您可以编辑某些内容,那么不可变值必须有一个可变容器。因此,您的视图模型应该作用于可变容器而不是直接作用于不可变值。

    整数是这种不可变值对象的一个​​示例: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 类的典型示例并没有真正的不同。字符串也是不可变的,所以我们再次为不可变值创建了一个可变容器。

    【讨论】:

    • 我正在考虑与您在此处指定的解决方案相同的路径,但不幸的结果是它会给您的 DDD 模型带来负担,为此值对象拥有一个通用容器,否则新的 ViewModel 将拥有为每个想要允许编辑相同值对象的容器创建。也许有一些方法可以将容器本身保留在 ViewModel 中,而不会使事情变得过于复杂......
    猜你喜欢
    • 2020-10-04
    • 2018-06-25
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    相关资源
    最近更新 更多