2016-02-12 52 views
0

我有50多个基本数据类,并且希望使用一致的方法以3种或4种不同格式显示这些类。简单类显示模板与视图模型

我知道大多数专家建议使用ViewModels。有的甚至recommend one per view

但是,通过直接在数据模型上直接使用不同的DisplayTemplates,创建/维护的代码肯定会少一些。

例如,比较这3个apporaches:


1:没有的ViewModels,使用DisplayTemplates不同的格式

class Person 
{ 
    public int ID {get;set;} 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
    public string NickName {get;set;} 
    public string Nationality {get;set;} 
    public string FavouriteColour {get;set;} 
    public string FavouriteBand {get;set;} 
} 

@Html.DisplayFor(m => m.Person, "Simple") 

@Html.DisplayFor(m =>m.Person, "Full") 

这似乎是最简单的选择,用最少的代码创建和维护。


2:只使用一个ViewModel当从数据模型

class Person 
{ 
    public int ID {get;set;} 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
    public string NickName {get;set;} 
    public string Nationality {get;set;} 
    public string FavouriteColour {get;set;} 
    public string FavouriteBand {get;set;} 
} 

class PersonSimpleViewModel 
{ 
    public int ID {get;set;} 
    public string NickName {get;set;} 
    public string Nationality {get;set;} 
} 

@Html.DisplayFor(m => m.Person) 

@Html.DisplayFor(m => m.PersonSimpleViewModel) 

此偏差将需要额外的VM用于每一个实体,和一个系统的像AutoMapperExpressMapper使用/配置。

我觉得它不必要地增加了复杂性。另外,x由50个实体组成,它创建/维护的代码更多。


3:视图模型为每个显示格式

class Person 
{ 
    public int ID {get;set;} 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
    public string NickName {get;set;} 
    public string Nationality {get;set;} 
    public string FavouriteColour {get;set;} 
    public string FavouriteBand {get;set;} 
} 

class PersonSimpleViewModel 
{ 
    public int ID {get;set;} 
    public string NickName {get;set;} 
    public string Nationality {get;set;} 
} 

class PersonFullViewModel 
{ 
    public int ID {get;set;} 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
    public string NickName {get;set;} 
    public string Nationality {get;set;} 
    public string FavouriteColour {get;set;} 
    public string FavouriteBand {get;set;} 
} 

@Html.DisplayFor(m => m.PersonSimpleViewModel) 

@Html.DisplayFor(m => m.PersonFullViewModel) 

这个选项需要最代码,而且感觉很傻,因为Full VM是相同的数据模型。

但是我宁愿超过2,因为它是一致的 - 每种显示格式都有相应的虚拟机,数据模型无处可见。

回答

2

不知道有关您的应用程序或其要求的更多细节,很难说您是否应该创建视图模型。你有一个选择是避免它们,并使用你的实体类,直到你意识到你需要视图模型。

... x由50个实体组成,它创建/维护的代码更多。

不知道我买这个参数。这可能最多只需要几分钟时间来创建每个视图模型类。假设创建每个视图模型需要5分钟,另外需要5分钟将其连接到Automapper或ExpressMapper。这对每个实体来说都是10分钟。如果你每小时休息10分钟,你可以每小时完成5次,这意味着10小时完成。这比一天的工作稍微多一点(你应该可能而不是一次完成,但根据需要零碎)。另外请记住,实际上,您可能不需要为每个实体创建视图模型,但您需要为每个视图创建视图模型。通常,想要呈现给用户的数据是由两个或更多个实体串联而成的。如果你需要这些视图模型来输入数据,那么join参数可能不适用,但其他人可以。例如,如果要将属性应用于视图模型,以便可以将序列化或验证规则应用于视图模型,该怎么办。您不希望在实体类中添加这些属性,因为它负责数据存储,而不是用户输入序列化或验证。

然后有派生属性。说一个你的意见,你想有一个DisplayName属性为您的Person。你会在你的实体中添加如下内容吗?

public string DisplayName => $"{FirstName} ({NickName}) {LastName}"; 

为什么用数据存储类污染数据存储类时只需将数据呈现给用户?

我觉得它不必要地增加了复杂性。

这可能是,这就是为什么我说这是一个很难回答的问题,而不知道有关应用程序的更多细节。这些视图模型对我来说真的只是“数据桶”,所以我真的不认为它们很复杂。也就是说,维持这种分离是额外的成本。就像任何事情一样,这个成本是否合理取决于你能从中获得什么样的好处。

+0

谢谢。我正在尝试创建**一致的基础结构**,我可以在创建应用程序时遵循该基础结构。所以一方面我想保持灵活性和'最佳实践'。另一方面,我不想让自己为添加的每个实体创建一百万个虚拟机(略微夸张)。 –

+0

在这种情况下,我只谈论简单的通用实体 - 例如社交个人资料网址,联系人表单收件人,网页标记。较大/复杂的实体可能会为每个应用定制。 –

1

以下是一些一般指导。

仅在显示时才使用该实体。将实体传递给视图的最大问题是当你允许以某种方式修改该实体时。如果只是将数据显示为只读,则一定要使用该实体,不要担心额外的类。

当您接受用户输入时使用视图模型。您需要从视图模型映射到实体的额外步骤,以便根据需要清理用户输入,然后您只能允许修改应允许修改的属性。

简而言之,在有意义时使用视图模型。如果您需要对某些属性进行某种复杂处理以显示它们,那么视图模型对于该逻辑来说是一个很好的地方。或者,您可以使用视图模型来简化属性访问。基本上,使用视图模型时,这样做可以减少视图中需要执行的逻辑数量。你的观点应该尽可能少逻辑,视图模型通常可以帮助解决这个问题。