实体与模型与视图模型[重复]

2024-02-06

我只是花了一些时间阅读这些术语(我不太使用它们,因为我们没有任何 MVC 应用程序,我通常只说“模型”),但我感觉这些术语根据上下文意味着不同的东西:

Entity

这很简单,就是数据库中的一行:

  1. 就数据库而言,实体是单个人、地点或 关于可以存储哪些数据的问题。

Model

我经常读到,这基本上是表示完整数据集的实体组合,假设客户的地址列表模型将组合实体客户、地址和可能的个人。

视图模型

MVVM 或 MVC 模式中的一个术语,它是一个模型,它准确地表示您可以在视图上看到的数据。视图模型位于应用程序层并具有用于验证的属性,例如ASP.NET MVC 模型与 ViewModel https://stackoverflow.com/questions/4061440/asp-net-mvc-model-vs-viewmodel

在我看来,这些术语似乎有点多余:Viewmodel 显然有他的用处,否则视图将不得不做所有艰苦的工作来显示正确的东西。实体只是表示,正如我们从 EF 中知道的那样,但是如果将这两者结合起来,模型他的用处在哪里呢?

验证、安全性等工作必须在 ViewModel 上完成。当您有数百个小表在实体和视图模型之间放置另一个抽象时,您会使用该模型吗?或者 MVC 和 MVVM 实体和模型通常是相同的吗?

像往常一样感谢并祝周末愉快

Matthias


“模型”一词是有歧义的。他们都是模特。

实体模型

一个与持久性结构非常相似的类。 A成员实体是一种模型,表示数据库中 Members 表中的一个成员行。不严格依赖于数据库,而是某种持久性的实体。通常具有“ID”属性,例如“int MemberID”。

视图模型

与视图/UI 上的结构非常相似的类。 A成员视图模型是一个模型,表示要显示在应用程序前端的成员视图/UI 上的一个成员。与 MV* 模式没有严格关联。

Notice

...上述两个模型代表应用程序边界上的通信。即接收通信(用户事件和通过协议进行通信)以发起业务规则的前端边界(入口点);后端边界接受业务规则的命令以与其他系统(例如数据库或其他端点)进行开放通信。

领域模型

代表问题域的一部分的类。这会员模型负责其创建和验证。由于服务接收和返回模型,因此模型负责它们自己的业务逻辑,从而验证它们的正确构造和使用。例如:A会员模型如果您尝试在没有用户名的情况下使用它,应该会中断。

领域服务

域服务采取实体模型并将它们转化为领域模型所以说服务可以与模型一起工作。如果一个实体从后边界进入并且无法序列化或映射到域模型中,则会出现一个危险信号:数据不好.

域服务采取领域模型并将它们映射到Entities以便将他们送出后界。如果后边界(DB/SDK?)无法接受模型,则需要修复DB/SDK。

  • 注意:实体符合模型因为坚持是一个细节。域是系统的王,而不是持久性的硬件或表结构。域永远不会错。

前边界采取视图模型并将它们转化为领域模型这样它们就可以传递到域中。如果 ViewModel 无法序列化或映射到域模型,则会出现一个危险信号,表明 view/json/xml 是错误的。

域服务返回领域模型到前边界​​,然后映射到视图模型以便与前方沟通。如果视图/UI 无法接受模型,则需要修复视图。

  • 注意:ViewModel 符合 Models因为消费者是一个细节。域是系统的王,而不是使用它们的 UI 或子应用程序。域永远不会错。

ViewModel 永远不知道实体因为 UI/消费者永远不知道持久性的存在。

核心业务逻辑不应该了解视图模型或实体。核心业务逻辑仅适用于领域模型。这就是控制器和它们附近的前端服务存在的原因;映射域模型 ViewModel。这也是 SDK 及其附近的后端服务存在的原因;映射 DomainModels 实体。

当构建系统时,首先构建域和业务逻辑(希望是 TDD)。然后将适配器放置在业务逻辑的前端和后端,确定交付机制(前端)和依赖项(服务/持久性)(后端)。但这些前端和后端可以被剔除,核心业务逻辑仍然存在。

较短版本(TLDR;):

实体:数据库记录。

领域模型:模型特定的业务逻辑(Google“值对象”),用于表示领域问题中的对象。

ViewModel:视图的页面(或部分)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体与模型与视图模型[重复] 的相关文章

  • C# - Visual Studio 中的 System.OutOfMemoryException

    我遇到问题 当我右键单击 Visual Studio 中的主窗体并转到 视图设计器 时 出现错误 它说 引发了 System OutOfMemoryException 类型的异常 堆栈跟踪 at System Reflection Asse
  • 是否有可能将 *.pdb 文件包含到发布版本中以查看错误行号?

    我做了一个项目 所有设置都是默认的 当我在调试模式 构建配置 调试 下运行它并遇到异常时 它转储到我的自定义日志记录机制 其中包含错误行号 但是当我运行发布构建时 记录相同的异常 没有行号 只有方法抛出和记录调用堆栈 是否有可能在发布配置
  • 在异步请求中使用超时回调

    我之前问过这个问题 但我将用提出的解决方案来完成这个问题 并提出另一个问题 我正在使用这个类来进行异步网络请求 http msdn microsoft com en us library system net webrequest aspx
  • C# 实体框架我们应该使用 POCO.Id 还是仅使用 POCO 设置关系?

    我在服务方法中遇到一种情况 将 POCO 分配为另一个 POCO 的子对象无法按预期工作 我正在使用实体框架 4 public void ChangeOrderCurrency Currency currency order Currenc
  • 为什么我在 WinForms 列表框中得到“System.Data.DataRowView”而不是实际值?

    每当我运行代码并尝试查看highscore我在列表框中得到的只是System Data DataRowView 谁能明白为什么吗 Code MySqlConnection myConn new MySqlConnection connStr
  • 使用默认行为将模型绑定到接口

    我正在尝试将控制器操作绑定到接口 但仍保持默认的绑定行为 public class CoolClass ISomeInterface public DoSomething get set ISomeInterface public clas
  • AcceptSocket 超时?

    是否有可能AcceptSocket on a TcpListener具有超时的对象 以便它偶尔被中断 TcpListener server new TcpListener localIP port server Start while sh
  • PartialView Action 正在调用自身

    我有 MVC 应用程序 它用于从主视图 ProductMaster 将 ProductAreaGrid 列表显示为 PartialView 并且它将在局部视图内将 CreateProductArea 作为 PartialView 我的 Gr
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 主构造函数不再在 VS2015 中编译

    直到今天 我可以使用主构造函数 例如 public class Test string text private string mText text 为了能够做到这一点 在以前的 Visual Studio CTP 中 我必须将其添加到 c
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • 确定相关词的编程方式?

    使用网络服务或软件库 我希望能够识别与词根相关的单词 例如 座位 和 安全带 共享词根 座位 但 西雅图 不会被视为匹配 简单的字符串比较对于这类事情似乎是不可行的 除了定义我自己的字典之外 是否有任何库或 Web 服务不仅可以返回单词定义
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 在 Windows 上使用 C/C++ 开发时省略 msvcr100.dll?

    是否可以在 Windows 上使用 C C 进行开发而不链接到 msvcr100 dll 我知道这是 Windows 的标准 c 库 但我想知道如果我没有安装 Visual Studio 或 Redistributable 软件包 我的计算
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in
  • 如何使 WinForms UserControl 填充其容器的大小

    我正在尝试创建一个多布局主屏幕应用程序 我在顶部有一些按钮链接到应用程序的主要部分 例如模型中每个实体的管理窗口 单击这些按钮中的任何一个都会在面板中显示关联的用户控件 面板包含用户控件 而用户控件又包含用户界面 WinForms User
  • 使用方法的状态模式

    我正在尝试使用方法作为状态而不是类来基于状态模式的修改版本来实现一个简单的状态机 如下所示 private Action
  • 是否可以检测流是否已被客户端关闭?

    简要介绍一下情况 我有一项服务可以通过套接字接收信息并发送回复 连接不安全 我想设置另一个可以为这些连接提供 TLS 的服务 这个新服务将提供单个端口并根据提供的客户端证书分发连接 我不想使用 stunnel 有几个原因 其中之一是每个接收

随机推荐