关于 MVC 的领域、模型和实体之间的区别

Posted

技术标签:

【中文标题】关于 MVC 的领域、模型和实体之间的区别【英文标题】:Differentiating between domain, model, and entity with respect to MVC 【发布时间】:2013-03-10 12:39:18 【问题描述】:

谁能解释这 3 个概念以及它们在 MVC 框架方面的区别以及示例。对我来说,这些看起来几乎是等价的,而且似乎它们在某些文章中可以互换使用,而在其他文章中则没有。

【问题讨论】:

【参考方案1】:

我同意这些条款有点模糊。我会使用 domain 来指代您正在处理的业务领域。比如银行或保险之类的。然后你有域模型。这些是您在该业务域中处理的事情,例如对于银行的,您拥有帐户、客户、转账等。我会使用术语 entity 来引用类/ POJO 或模型的持久化/具体版本。

这里可能让你感到困惑的是,在术语 MVC 中,model 是一个具体的东西,但它引用了用于表示 Web 中的某些呈现的数据模型GUI 所以不要把它和上面的解释混在一起。

【讨论】:

【参考方案2】:

您感到困惑的术语是:“domain objects”、“域实体”和“模型对象”。虽然通常可以互换使用,但域实体和模型对象也可以是 active record 模式的实例(基本上:添加了存储逻辑的域对象)。

在普通域对象中没有存储逻辑。它由data mappers处理。

术语“模型对象”来自 Fowler 的书籍(请阅读 PoEAA 了解更多详细信息),恕我直言,它是混淆 MVC 的一部分,因为整个模型是一个应用层(MVC 由它和表示层组成),其中包含那些“模型对象”,通常由services 处理(在该图像中,模型层是所有三个同心圆在一起)。

我更喜欢使用“域对象”一词。

当作者暗示对象是存储结构(更常见的是数据库表)的直接表示时,通常使用术语“域实体”(或“实体对象”)。这些也几乎总是活动记录的实现。

P.S.:在某些文章中,您还会看到术语“模型”(复数)。它通常与 MVC 设计模式没有直接关系,因为它讨论的是类似 Rails 的架构,其中“模型”只是活动记录,直接暴露给控制器/由控制器创建。

..不确定这是否让你更困惑

【讨论】:

【参考方案3】:

为了记录。实际上,领域和模型是相同的,而实体也是用于存储在数据库中的领域/对象。

有些人试图重新解释这些话题,但没有一个是经典。

不同之处在于,在 Java 的世界中,Domain 被更多地使用,而在 C# 的世界中,Model 被使用(MS 鼓励他使用)但它只是惯例,你可以同时使用。

同样的概念,Java 的人使用值对象 (VO),而 C# 的人使用 DTO,即使两者实际上是相同的。还有 POJO (Java) vs POCO (C#)、Packages (Java) vs NameSpace (C#)、Setter and Getter (Java) vs Encapsulation (C#)

【讨论】:

【参考方案4】:

域和模型都是类。类的使用方式区分它是否应该分类并放入域或模型文件夹中。如果该类仅在视图中使用,请将其放在模型文件夹中。如果该类映射到数据库对象,则将其放在域文件夹中。

【讨论】:

以上是关于关于 MVC 的领域、模型和实体之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

领域模型和实体框架之间的存储库模式和映射

DDD领域驱动设计实战-深入理解实体

实体 VS 领域模型 VS 视图模型

统一建模语言

业务领域建模Domain Modeling

领域模型贫血模型充血模型概念总结