“模型”一词是有歧义的。他们都是模特。
实体模型
一个与持久性结构非常相似的类。 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:视图的页面(或部分)。