模型 - 视图 - ViewModel模式违反DRY?

时间:2009-07-27 19:12:00

标签: silverlight mvvm dry

我今天阅读了这篇文章http://dotnetslackers.com/articles/silverlight/Silverlight-3-and-the-Data-Form-Control-part-I.aspx关于在Silverlight应用程序中使用MVVM模式的情况,其中您拥有域实体并查看特定实体,这些实体基本上是真实实体对象的子集。这不是明显违反DRY原则吗?如果是这样,你怎么能以一种很好的方式处理它呢?

4 个答案:

答案 0 :(得分:7)

就个人而言,我不喜欢Dino在那里做的事情,我不会以同样的方式解决问题。我通常认为VM是模型类的过滤,分组和排序集合。对我来说,VM是直接映射到View,因此我可能会创建一个NewOrderViewModel类,其中包含View使用的多个CollectionView(可能是客户的一个CV和产品的另一个CV,可能都已过滤)。在Model中为每个类创建一个全新的VM类确实违反了DRY。我宁愿使用派生或部分类来在必要时扩充模型,添加View特定(通常计算)属性。 IMO .NET RIA服务是将M和VM数据结合起来的一个很好的实现,它可以在客户端和服务器上使用。迪诺是一个出色的家伙,但是可以在这个问题上打电话给他。

答案 1 :(得分:2)

干旱是原则,而不是硬性规则。你是一个人,可以区分。 例如。如果DRY确实是一个硬规则,你永远不会将相同的值分配给两个不同的变量。我想在任何非平凡的程序中你都会有多个包含值0的变量。

一般来说:DRY通常不适用于数据。那些视图特定实体可能只是数据传输对象而没有任何值得注意的逻辑。由于各种原因,数据可能会重复。

答案 2 :(得分:1)

我认为答案实际上取决于您认为ViewModel应该是什么。对我来说,ViewModel代表当前显示的屏幕的模型。

因此对于像ViewCategoryViewModel这样的东西,我没有类别中字段的重复。我将一个Category对象公开为ViewModel上的属性(在“SelectedCategory”下),视图需要显示的任何其他数据以及屏幕可以采用的命令。

域模型和视图模型之间总会有一些相似之处,但这一切都归结为您选择创建ViewModel的方式。

答案 3 :(得分:1)

与数据传输对象(DTO)相同。

这两种对象类型的不同,因此不违反DRY

考虑以下示例:

class Customer
{
    public int Age
}

一个相应的视图模型:

class CustomerViewModel
{
    public string Age;

    // WPF validation code is going to be a bit more complicated:
    public bool IsValid() 
    {
        return string.IsNullOrEmpty(Age) == false;
    }
}

不同的域 - 不同的属性类型 - 不同的对象。