【问题标题】:Best Practice Entity Framework Models vs ViewModels最佳实践实体框架模型与视图模型
【发布时间】:2014-03-01 06:19:24
【问题描述】:

根据我的阅读,我知道我们应该始终将视图模型传递给视图。但是,有时此视图模型与 EF 模型完全相同或几乎相同。是否可以接受或有任何解决此问题的方法(重复代码)?

例如,如果我有这个 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...?

谢谢。

【问题讨论】:

  • 只使用最简单的,并且对特定情况最有意义。力求简单和可读性。如果它使代码更难理解,那么僵化是没有意义的。

标签: c# asp.net-mvc entity-framework viewmodel


【解决方案1】:

这些类的区别在于您的应用程序如何与之交互。 ModelViewModel 的受众不同。

您的模型应该与您的应用程序交互,有时很多人更喜欢在 EF Code First 中将这些模型用作实体。它们就是我们所说的领域对象。

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

但是,有时此视图模型与 EF 模型完全相同或几乎相同。

这里的关键词是“有时”。没错,对于一个非常简单的应用程序,您甚至不需要考虑 ViewModels,您的模型在大多数情况下都可以简单地使用。但是,请考虑一些情况,例如,您希望显示 最新帖子最新 cmets 的列表,让我们说 一些相关帖子 在单视图。你要做什么?这就是 ViewModels 的来源。您将特定的 ViewModel 传递给您的视图,其中包含所有必要的数据、帖子、cmets 和相关帖子。

在大多数情况下,您的 ViewModel 应该由多个 Models 构建而成,有时,ViewModelporperties 是类型模型

【讨论】:

  • 我明白为什么我需要一个视图模型。我不太确定......是如何编写高效的视图模型。我编辑了我的问题以便更清楚。
【解决方案2】:

我知道这个问题被问到已经有一段时间了。但是,这可能会对正在寻找答案的人有所帮助。

尽管您拥有与模型几乎相同的 ViewModel,但建议您使用相同的代码创建 ViewModel。

可能的原因是

  1. 您可能希望使用数据注释向属性添加验证。 不建议进行更具体的验证 您的模型中的屏幕应该是您的反映 数据库结构。

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

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

干杯!

【讨论】:

  • 我同意理由 #1,但我觉得 #2 违反了 YAGNI (en.wikipedia.org/wiki/You_aren%27t_gonna_need_it)。此外,automapper 似乎很棒,直到您意识到执行该映射的代码的静态特性意味着您可以检查、编译它并且其他人可以对其进行代码审查。现在这一切都通过反射完成了,这不再起作用了。只是我的两分钱。
猜你喜欢
  • 2012-07-03
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多