MVC和DDD可以一起使用。我们在DDD和MVC中都称之为“模型”的内容实际上是相同的:抽象层。以下是一些示例的伪代码。
Model View Controller (MVC)
Model View Controller(MVC)架构将软件分为三个部分:
模型层
MVC架构中的模型层是存储逻辑的位置。在这个层次上,我们有我们的模型和业务逻辑。
class Car {
String color;
String year;
Cat(color, year) {
this.color = color;
this.year = year;
}
}
一个简单的汽车抽象。
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);
}
}
使用服务实现简单的汽车CRUD
视图层
视图层是用户界面所在的地方。这里是用户可以与系统交互的地方,当用户执行操作时将触发控制器,控制器将通知模型层并请求数据。视图层可以存在于应用程序的客户端或服务器端(例如:Java Server Faces (JSF) 作为服务器端,ReactJS 作为客户端)。无论如何,即使视图层位于客户端,客户端也需要请求服务器端发送请求。这可以通过Web应用程序的HTTP请求来完成。
<theCarPage>
<theCar>
getTheCarOnLoad();
</theCar>
</theCarPage>
汽车伪页面。
控制器层
控制器层基本上从视图接收输入,然后将数据转换并发送到模型层,反之亦然。
class CarController {
@OnLoadingTheCarPage
getTheCarOnLoad() {
return theCar();
}
}
领域驱动设计(DDD)
领域驱动设计是一个概念:
DDD的基础在于类、类变量和类方法必须与其核心业务领域相匹配。
领域驱动设计居住在“M”中
在这种情况下,当应用MVC架构时,领域驱动设计位于MVC架构的模型层中。如前所述,模型层是应用程序业务逻辑所在的地方。
无论你是否有实体,它们仍然是模型。模型只是现实世界中某个东西的抽象表示。如果抽象化,猫可以成为一个模型:
装载汽车的方法。
class Cat {
String color;
String age;
Cat(color, age) {
this.color = color;
this.age = age;
}
}
简单的猫抽象。它是猫的模型。
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;
}
}
一个简单的实体。实体是模型。
数据传输对象 (DTO)
数据传输对象本身没有任何逻辑,在传输数据从一个端点到另一个端点时,它们仅用作容器。通常情况下,企业实体本质上不可序列化,因此我们需要一种方式,只发送需要发送到客户端的数据。
由于模型可能具有敏感数据或者我们不想在请求中共享的数据,例如考虑我们的 Cat Model,我们可以创建一个不共享 Cat ID 的 DTO:
class CatDTO {
String color;
String age;
}
一种用于猫咪的数据传输对象。我们只需要它的属性以及获取和设置这些属性的方法。我们不想分享它的ID。
因此,如果我们需要通过REST从客户端请求所有猫咪的列表,则应该请求响应我们的CatDTO而不是Cat Entity的端点:
[
Cat {
"color": "yellow",
"age": "1"
},
Cat {
"color": "black",
"age": "4"
}
]
这就是客户可以看到的所有数据。