【问题标题】: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】:

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

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

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

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

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

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

【讨论】:

  • 我明白为什么我需要一个视图模型。我不太确定......是如何编写高效的视图模型。我编辑了我的问题以便更清楚。
【解决方案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
相关资源
最近更新 更多