2014-03-01 79 views
1

从我读,我明白,我们总是应该传入一个视图模型的视图。但是,有时这个视图模型与EF模型完全一样或几乎相同。它是可以接受的还是有解决这个问题的办法(重复代码)?最佳实践实体框架模型VS的ViewModels

举例来说,如果我有这样的EF-型号:

class UserModel 
{ 
    string id {get;set} 
    string name {get;set} 
    string address {get;set} 
    string phone {get;set} 
    string website {get;set} 
} 

视图模型如何应该是...是这样的:

class UserViewModel 
{ 
    string name {get;set} 
    string address {get;set} 
    string otherobject {get;set} 
} 

或者这样:

class UserViewModel 
{ 
    UserModel user; 
    string otherobject {get;set} 
} 

使用选项#1,属性会重复...而在另一个视图模式中,它们会再次重复。我将需要重复每个视图模型上的所有数据注释。但是,我只发送我需要的属性。

对于选项#2,什么是重复的,但我经过了很多,我并不需要的属性。

的最后一个选项是混合选项#1,根据需要选择#2 ...但我不喜欢,因为缺乏一个共同的标准的这个选项。有时,属性将在视图模型中定义和数据注解,有时也会在EF模型中定义。

我希望有一个选项#4,我没有看到...?

谢谢。

+0

只要使用最简单,最适合该特定情况的东西。为了简单和可读性而努力......如果使代码更难理解,就没有任何僵化之处。 –

回答

2

这些类的区别就是你的应用程序如何与交互。 模型ViewModel有不同的观众。

模式应该与您的应用程序进行交互,有时候很多人喜欢用这些模型为实体在EF代码第一次。他们就是我们所说的域对象。

另一方面,ViewModels应该与您的视图进行交互。在你的服务层,你用一些数据填充你的ViewModel,你可以从你的控制器访问它们。

但是,有时这种视图模型与EF模型完全一样或几乎相同。这里

的关键词是 “有时”。你是对的,对于一个非常简单的应用程序,你甚至不需要考虑ViewModels,其中你的模型可以在大多数情况下使用。然而,想想一些例子,如你想要显示的列表最新帖子列表,最新评论,并且我们说一些相关帖子在单个视图上。你要做什么?这就是视频模型出现的地方。您将特定的ViewModel传递给您的视图,其中包含所有必要的数据,帖子,评论和相关帖子。

在大多数情况下,你视图模型应该从多个建立模式,有时,一个视图模型porperties模式

+0

我明白为什么我需要一个视图模型。我不太确定......是如何编写高效的视图模型。我编辑我的问题更清楚。 – simonauger

1

我知道它已经相当一段时间,因为类型这个问题被问到。但是,这可能会帮助正在寻找答案的人。

虽然您有与模型​​几乎相同的ViewModel,但建议使用相同的代码创建ViewModels。

可能的原因是

  1. 你可能想验证添加到使用数据注释特性。 建议不要在您的模型中对 屏幕进行更具体的验证,这些验证应该是您的 数据库结构的反映。

  2. 您的ViewModels将来可能会发生变化。现在可能没有意义,但是 总是有可能。

如果您担心映射代码在大多数情况下看起来很明显,那么您可以使用Automapper。

干杯!