DDD和MVC:“模型”和“实体”之间的区别

我对MVC中“模型”的概念感到非常困惑。 目前存在的大多数框架将模型放置在控制器和数据库之间,而模型几乎就像数据库抽象层一样。 控制器开始执行越来越多的逻辑时,“Fat Model Skinny Controller”的概念就消失了。

在DDD中,还有一个域实体的概念,它具有唯一的身份。 据我所知,用户是一个很好的例子(例如唯一的用户标识)。 实体有一个生命周期 – 它的价值可以在整个行动过程中改变 – 然后它被保存或丢弃。

我上面描述的实体是我认为模型应该在MVC? 我是多么基地?

为了更多地混淆事物,可以使用其他模式,比如Repository模式(也许把服务放在那里)。 很明显Repository如何与一个实体交互 – 它是如何与一个模型?

控制器可以有多个模型,这使得它看起来像一个模型是一个“数据库表”而不是一个独特的实体。

更新: 在这篇文章中 ,模型被描述为知识的东西,它可以是单数或对象的集合。 所以这听起来更像一个实体和一个模型差不多。 该模型是一个包罗万象的术语,实体更具体。 价值对象也是一个模型。 至less在MVC方面。 也许???

那么,用非常粗略的话说哪个更好呢?

没有“模型”真的…

class MyController { public function index() { $repo = new PostRepository(); $posts = $repo->findAllByDateRange('within 30 days'); foreach($posts as $post) { echo $post->Author; } } } 

还是这个,有一个模型作为DAO?

 class MyController { public function index() { $model = new PostModel(); // maybe this returns a PostRepository? $posts = $model->findAllByDateRange('within 30 days'); while($posts->getNext()) { echo $posts->Post->Author; } } } 

这两个例子甚至没有做我上面所描述的。 我显然已经失去了 任何input?

实体

Entity是指一个对象,它是业务逻辑使用的一个单一项目,更具体地说,是具有某种types身份的项目。
因此,许多人将ORM映射的对象称为实体。

一些称为“ 实体 ”的类,其实例表示数据库中的单个行。

其他一些人则倾向于只把这些类中的那些类称为“实体”,它们也包含业务规则,validation和一般行为,并将其他类称为“ 数据传输对象 ”。

模型

Model与应用程序的UI(= View )和控制stream(= Controller )没有直接关系,而是关于数据访问和应用程序的主要数据抽象如何工作的方式。

基本上,任何东西都可以成为适合上述的模型。

MVC

您可以在MVC中将实体用作模型。 他们是指两种不同的东西,但同一类可以称为两个。

例子

  • Customer类是一个非常实体(通常),您也可以将其用作应用程序中数据访问的一部分。 在这种情况下,它既是一个实体,又是一个模型。
  • 一个Repository类可能是模型的一部分,但它显然不是一个实体。
  • 如果在业务逻辑层中间使用了一个类,但不暴露给应用程序的其余部分,则该类可能是一个实体,但从MVC应用程序的angular度来看,它显然不是一个Model。

你的例子

至于你的代码示例,我宁愿第一个。
模型(Model)是一个被用作应用程序的数据抽象的手段,而不是一个具有名称后缀“Model”的类。 很多人认为后者是英国媒体报道。

你几乎可以认为你的Repository类是模型的一部分,即使它的名字没有后缀“Model”。

我想补充一点,事实上,第一个和其他人一起工作也是比较容易的,对于其他需要了解代码的人来说,理解起来更容易一些。

所有的答案都是不同的东西的重大混搭,只是错误的。

DDD中的模型与现实世界中的模型非常相似:对事物的简化和抽象。 没有更less,也没有更多。 它与数据,对象或其他任何东西都无关。 这只是一个领域部分的概念。 而且在每个复杂的领域,总是有不止一个模型,例如交易,进销存,物stream。

一个实体不是一个“具有身份的模型”,而只是一个具有身份的对象。

存储库不仅仅是第一级caching,也是域的一部分。 它给出了内存中的对象的幻觉,并负责从任何地方获取聚集(不是实体!),并保存它们,即维持对象的生命周期。

如果你谈论DDD概念,首先阅读基础知识来解决你的知识问题。 像这里一样ThinkDDD 。

应用程序中的“模型”是保存数据的位。 如果我没有记错的话,领域驱动devise中的“实体”就是一个具有身份的模型。 也就是说,实体是一个通常直接对应于数据库或文件中的“物理”元素的模型。 我相信DDD定义了两种types的模型,一个是实体,另一个是价值,这只是一个没有和身份的模型。

存储库模式只是一种索引的模型/实体集合。 因此,举例来说,如果你的代码需要命令#13,它会首先向仓库询问它,如果它不能从那里得到它,它将从任何地方去取。 如果你愿意,它基本上是一级caching。 它与模型的行为方式以及它如何与实体相互作用没有区别,但是由于存储库的思想是能够使用它们的ID来获取模型,所以在DDD方面,只有实体才能被允许进入库。

使用服务和集合的简单解决scheme:

 <?php class MyController { public function index() { $postService = ServiceContainer::get('Post'); $postCollection = $postService->findAllByDateRange('within 30 days'); while($postCollection->getNext()) { echo $postCollection->current()->getAuthor(); } } } 

编辑:模型(类)是实体scheme的简单表示。 模型(对象)是一个单一的实体。 该服务在模型上运行,并向控制器提供具体数据。 没有控制器有任何型号。 模型独立。
在另一方面,映射器将模型映射到持久层(例如:数据库,第三方后端等)。

虽然这是专门关于Ruby on Rails的,但由于讨论围绕着MVC和DDD,所以同样的原则和信息仍然适用。

http://blog.scottbellware.com/2010/06/no-domain-driven-design-in-rails.html