有人可以通过示例解释这三个概念以及它们之间在 MVC 框架方面的区别。对我来说,这些看起来几乎是等价的,而且似乎它们在某些文章中可以互换使用,而在其他文章中却没有。
4 回答
您感到困惑的术语是:“域对象”、“域实体”和“模型对象”。虽然通常可以互换使用,但域实体和模型对象也可以是活动记录模式的实例(基本上:添加了存储逻辑的域对象)。
在普通域对象中没有存储逻辑。它由数据映射器处理。
术语“模型对象”来自 Fowler 的书籍(有关详细信息,请阅读PoEAA),恕我直言,它是混淆 MVC 的一部分,因为整个模型是一个应用层(MVC 由它和表示层组成),其中包含那些“模型对象”,通常由服务处理(在该图像中,模型层是所有三个同心圆在一起)。
我更喜欢使用“域对象”术语。
当作者暗示对象是存储结构(更常见的是数据库表)的直接表示时,通常使用术语“域实体”(或“实体对象”)。这些也几乎总是活动记录的实现。
PS:在某些文章中,您还会看到术语“模型”(复数)。它通常与 MVC 设计模式没有直接关系,因为它讨论了类似 Rails 的架构,其中“模型”只是活动记录,直接暴露给控制器/由控制器创建。
..不确定这是否让你更困惑
我同意这些条款有点模糊。我会使用域来指代您正在处理的业务领域。比如银行或保险之类的。然后你有域模型。这些是您在该业务领域中处理的事情,例如您拥有帐户、客户、转账等的银行领域。我将使用术语实体来引用类/POJO 或模型的持久/具体版本。
这里可能让您感到困惑的是,在术语MVC中,模型是一个具体的东西,但它引用了用于表示 Web GUI 中的某些表示的数据模型,因此不要将其与上述解释混为一谈。
作为记录。实际上,域和模型是相同的,而实体也是用于存储在数据库中的域/对象。
有些人试图重新解释这些话题,但没有一个是经典。
不同之处在于,在 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#)
域和模型都是类。类的使用方式区分它是否应该分类并放入域或模型文件夹中。如果该类仅在视图中使用,请将其放在模型文件夹中。如果该类映射到数据库对象,则将其放在域文件夹中。