Tim*_*lem 62 architecture model-view-controller model dto
MVC模型对象,域对象和DTO之间有什么区别?
我的理解是:
MVC模型对象:
为相应视图显示的数据建模.它可能不直接映射到域对象,即可能包括来自一个或多个域对象的数据.
域对象:
用于对问题域中的现实世界对象进行建模的对象,如预留,客户,订单等.用于保存数据.
DTO(数据传输对象):
当层处于单独的进程中时,用于在层之间传输数据的对象,例如从DB到客户端应用程序.在获取与多个域对象相对应的数据时,允许跨线的单个事务而不是多个调用.DTO仅包含数据和访问器方法,并且不存在逻辑.该数据用于特定的DB事务,因此它可以或可以不直接映射到域对象,因为它可以包括来自一个或多个域对象的数据.
所以,问题:
以上理解是否正确?我错过了一些关键点吗?
是否有任何理由不使用Domain对象作为MVC模型,假设Model对象不需要额外的业务逻辑?
是否有任何理由不使用DTO作为MVC模型,假设Model对象不需要额外的业务逻辑?
Pro*_*ofK 16
域和模型对象本质上是相同的,可能包含业务逻辑.根据实现,如果将业务逻辑从模型中移除到服务类中,则域和DTO对象可能是等效的.
通常,DTO的一个关键变体是视图模型,它纯粹用于在域模型和视图之间传输数据,尽管视图模型通常可能包含逻辑,尽管这应该是纯粹的UI逻辑.
Domain和DTO也可以是您的"模型"对象 - 您可以拥有一个视图来呈现"Customer"域对象的详细信息.
域对象可以具有业务逻辑来强制执行域实体的属性.验证就是这样一种情况.域对象本身不包含与持久性相关的方法,但它可以具有元数据(如注释)以支持持久性
POJO编程模型可以使用与您的域,DTO和模型对象相同的对象 - 实际上,您不会实现任何只应用于一个层但不适用于其他层的无关接口.
小智 7
MVC 和 DDD 可以一起使用。我们在 DDD 和 MVC 中所说的“模型”实际上是相同的:抽象。我们可以使用伪代码来说明一些示例。
模型层
MVC 架构中的模型层是逻辑所在的位置。在这一层中,我们有我们的模型和业务逻辑。
class Car {
String color;
String year;
Cat(color, year) {
this.color = color;
this.year = year;
}
//getters & setters
}
Run Code Online (Sandbox Code Playgroud)
一个简单的汽车抽象。
class CarService {
save(car) {
if(car.getColor() != null && car.getYear() != null) {
methodToSave(car);
} else {
throwsException();
}
}
find(car) {
return methodToFind(car);
}
update(car) {
assertThatExists(car);
methodToSave(car);
}
delete(car) {
assertThatExists(car);
methodToDelete(car);
}
}
Run Code Online (Sandbox Code Playgroud)
使用服务的汽车的简单 CRUD
视图层
视图层是用户界面所在的层。用户可以在此处与系统交互,然后系统将触发所执行的操作的控制器,然后控制器将通知模型层并请求数据。视图层可以驻留在应用程序的客户端或应用程序的服务器端(即:JSF(Java Server Faces)作为服务器端,ReactJS 作为客户端)。不管怎样,即使View层驻留在客户端,客户端也需要请求服务器端发送请求。这可以通过基于 Web 应用程序的 HTTP 请求来完成。
<theCarPage>
<theCar>
getTheCarOnLoad();
</theCar>
</theCarPage>
Run Code Online (Sandbox Code Playgroud)
汽车的伪页面。
控制器层
控制器层基本上接收来自视图的输入,然后转换数据并将其发送到模型层,反之亦然。
class CarController {
@OnLoadingTheCarPage
getTheCarOnLoad() {
return theCar();
}
}
Run Code Online (Sandbox Code Playgroud)
加载汽车的方法。
领域驱动设计是一个概念: DDD 的基础是类、类变量和类方法必须与其核心业务领域相匹配的概念。
在这种情况下,当应用 MVC 时,领域驱动设计驻留在 MVC 架构的模型层中。如前所述,模型层是应用程序的业务逻辑所在的位置。
无论您是否有实体,它们仍然是模型。模型只是现实世界中某些事物的抽象。如果抽象的话,猫可以是模型:
class Cat {
String color;
String age;
Cat(color, age) {
this.color = color;
this.age = age;
}
//getters & setters
}
Run Code Online (Sandbox Code Playgroud)
简单的猫抽象。这是猫的模型。
DDD实体
在领域驱动设计中,我们有实体,它们也被归类为模型。它们之间的区别在于实体是可识别的。如果您有一个可识别且可以持久化的类,那么它就是一个实体。实体仍然是模型。
@AnEntity
@ThisCanBePersisted
class Cat {
@ThisIsAnId
@ThisValueIncrementsAutomatically
@PersistentProperty
Long id;
@PersistentProperty
String color;
@PersistentProperty
String age;
Cat(color, age) {
this.color = color;
this.age = age;
}
//getters & setters
}
Run Code Online (Sandbox Code Playgroud)
一个简单的实体。实体就是模型。
数据传输对象内部没有逻辑,它们的唯一用途是作为将数据从一个端点传输到另一个端点的容器。通常企业实体本质上是不可序列化的,因此我们需要一种方法来仅发送需要发送给客户端的数据。例如,由于模型可能具有敏感数据或我们不想在获取请求中共享的简单数据,因此考虑我们的 Cat 模型,我们可以创建一个不共享 Cat ID 的 DTO:
class CatDTO {
String color;
String age;
//getters & setters
}
Run Code Online (Sandbox Code Playgroud)
Cat 的数据传输对象。我们只需要它的属性以及获取和设置属性的东西。我们不想分享它的 ID。
因此,例如,如果我们必须使用 REST 从客户端请求所有猫的列表,那么我们将请求使用 CatDTO 而不是 Cat 实体进行响应的端点:
[
Cat {
"color": "yellow",
"age": "1"
},
Cat {
"color": "black",
"age": "4"
}
]
Run Code Online (Sandbox Code Playgroud)
这就是我们的客户可以看到的所有数据。
A DTO = is an object that carries data between processes.
Run Code Online (Sandbox Code Playgroud)
但最有趣的是,它除了存储和检索自己的数据外,没有任何行为!!!
坚持使用 MVC 方法...
Domain = subject of your entire application.
Model = contains the (programming languages objects : EX: C# objects) to make up the universe of your application.
Run Code Online (Sandbox Code Playgroud)
它们显然可以具有行为和属性(参见与 DTO 的区别)。
通常一个应用程序(一个轻量级的)可以有一个模型 - 在这种情况下,您的模型正是您的领域。另一个模型可以是完全不同的对象类型,即正在处理另一个对象类型。在这种情况下,它们都属于您的域,并被命名为“域模型 - 对象”。
希望这个答案是详尽无遗的,让您一目了然!
我的理解(简而言之)如下:
(MVC) 模型对象:
PersonEditModel,PersonViewModel或者只是PersonModel域对象:
DTO(数据传输对象):
大多数对象的定义根据对象的使用位置而有所不同:
Model:是在客户端或服务器中使用对象的一般定义。
Model View: 是一个使用 in 的对象client大多数时候Domain Object: 是一个使用 in和 的对象servertransfering data to the database。Data Transfer Object(DTO):是一种将数据从一个对象传输到另一个对象的对象,特别是在获取数据时API Call(例如:在用于获取数据的 api GET 方法调用中,您不得将数据库模型提供给客户端,为此目的,您使用dto)。注意:
the definitions are true most of the time但在某些情况下并不实用。
| 归档时间: |
|
| 查看次数: |
23784 次 |
| 最近记录: |