MVC模型对象,域对象和DTO有什么区别


77

MVC模型对象,域对象和DTO有什么区别?

我的理解是:

MVC模型对象:

为要通过相应视图显示的数据建模。它可能不会直接映射到域对象,即可能包含来自一个或多个域对象的数据。

  1. 客户端
  2. 可能包含业务逻辑。例如。验证,计算的属性等
  3. 没有与持久性相关的方法

域对象:

在问题域中对真实世界对象进行建模的对象,例如“保留”,“客户”,“订单”等。用于保留数据。

  1. 服务器端
  2. 没有业务逻辑

DTO(数据传输对象):

当层处于单独的进程中时(例如,从DB到客户端应用程序),用于在层之间传输数据的对象。当获取与多个域对象相对应的数据时,允许通过导线进行单个事务,而不是多个调用。DTO仅包含数据和访问器方法,并且不存在逻辑。数据用于特定的DB事务,因此它可能会或可能不会直接映射到域对象,因为它可能包含来自一个或多个域对象的数据。

  1. 在层之间传递时,在服务器端和客户端均使用
  2. 没有业务逻辑
  3. 没有与持久性相关的方法

因此,问题是:

  1. 以上理解正确吗?我是否缺少一些要点?

  2. 假设模型对象不需要额外的业务逻辑,是否有任何理由不将Domain对象用作MVC模型?

  3. 假设Model对象不需要额外的业务逻辑,是否有任何理由不将DTO用作MVC模型?


Answers:


23

域和模型对象本质上是相同的,并且可能包含业务逻辑。根据实现的不同,如果将业务逻辑从模型中删除到服务类中,则域和DTO对象可能等效。

DTO的一个关键变体通常是视图模型,它仅用于在域模型和视图之间传输数据,尽管视图模型通常可能包含逻辑,尽管这纯粹是UI逻辑。


谢谢两个响应者。现在对我来说似乎更清楚了。域对象可以具有诸如验证之类的业务逻辑,这些逻辑与数据直接相关。
蒂莫西·莫莱姆

2
仅需要一个单独的MVC模型对象来封装与在视图中显示数据有关的逻辑。如果没有,则将域对象用作MVC模型对象会更容易。
蒂莫西·莫莱姆

9

域和DTO也可以是您的“模型”对象-您可以通过视图来呈现“客户”域对象的详细信息。

域对象可以具有用于强制执行域实体属性的业务逻辑。验证就是这样一种情况。域对象本身不包含与持久性相关的方法,但是它可以具有元数据(如注释)来支持持久性

POJO编程模型使您可以使用与域,DTO和模型对象相同的对象-本质上,不会为您实现任何仅适用于一层但不适用于其他层的无关接口。


1
是的,这就是我在做什么。实际上,几乎在每种情况下,我都不需要使用Domain对象以外的任何对象。DTO用于具有跨域对象的多个数据项的复杂查询。
Timothy Mowlem

1
而且,只有在与要显示的模型数据相关的重要业务逻辑/处理相关的情况下,才真正需要单独的MVC模型类?
Timothy Mowlem

1
是的,这是拥有适当专用模型而不是使用域对象的原因之一。您的域对象可能只存储UTC日期,这对于所有业务逻辑也足够了。但是在用户界面上,可以说您必须在用户帐户的时区中显示它。模型将有助于执行此特定于UI的计算。
kartheek

5
A DTO = is an object that carries data between processes.

但是最有趣的是,除了存储和检索自己的数据外,它没有任何行为!!!

坚持使用MVC方法...

Domain = subject of your entire application.

Model = contains the (programming languages objects : EX: C# objects) to make up the universe of your application.

它们显然具有行为和属性(请参见与DTO的区别)。

通常,一个应用程序(一个轻量级应用程序)可以具有一个模型-在这种情况下,您的模型正是您的域。另一个模型可能是完全不同的对象类型,正在处理另一个模型。在这种情况下,它们两者都是您域的一部分,并被命名为“域模型-对象”。

希望这个答案是详尽无遗的,并且对您来说很清楚!


3

我的建议(简而言之)如下:

(MVC)模型对象:

  • 在某些使用上下文中表示某些事物,例如。PersonEditModelPersonViewModel或者只是PersonModel
  • 没有业务逻辑
  • 可以接受某些验证逻辑等
  • 用于从一个应用程序层向另一应用程序层提供数据。MVC控制器<-> MVC视图

域对象:

  • 表示一些业务对象(问题域中的实际对象)
  • 有业务逻辑
  • 不允许无效的对象状态,具有正确更改对象状态的方法
  • 用于封装与其相关的业务逻辑
  • 不必用于保留数据(甚至不应该)

DTO(数据传输对象):

  • 与模型对象相似,但应具有扁平结构
  • 仅简单类型的属性/字段(字符串,数字,日期时间,布尔值)
  • 用于跨应用程序边界传输数据。在Web服务器和Web浏览器之间

完美的答案!
盖拉夫

2

大多数对象的定义取决于对象的使用位置:

Model:是在客户端服务器中使用对象一般定义。

  1. Model View:是大多数时候使用的对象client
  2. Domain Object:是在和中使用的对象servertransfering data to the database
  3. Data Transfer Object(DTO):是一个将数据从一个对象传输到另一个对象的对象,特别是在获取数据时API Call(例如:在api GET方法调用中,获取数据时,您不得将数据库模型提供给客户端,为此您必须使用dto)。

注意:the definitions are true most of the time但是在某些情况下不可行。


1

1)不,这是ViewModel的定义。MVC模型对象和域对象都相同。
2)域模型(对象)始终存在,业务逻辑是可选的
。3)如果域对象中没有业务逻辑,则它将自动成为DTO。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.