5

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

4

4 回答 4

7

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

于 2009-07-27T21:14:55.187 回答
2

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

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

于 2009-07-27T19:19:46.653 回答
1

我认为答案真的取决于你在 ViewModel 中的感觉。对我来说,ViewModel 代表当前正在显示的屏幕的模型。

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

域模型和视图模型之间总会有一些相似之处,但这一切都取决于您选择如何创建 ViewModel。

于 2009-07-28T03:04:46.933 回答
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;
    }
}

Differnt domains - differnet property types - different objects.

于 2009-07-29T16:14:09.593 回答