您可能已经听说过胖模型/瘦 Controller 与瘦模型/胖 Controller 的区别。我最近听说,您可以在模型中的某些逻辑进入服务层之间的中间位置。这有多普遍?您知道(或可以想到)任何实际的例子来说明这一点吗?

最佳答案

马丁·福勒(Martin Fowler)描述了他伟大的书Service LayerPatterns of Enterprise Application Architecture模式。如果您关心所问的问题,则应该阅读本书。

我想到的一种用途是管理数据库事务。有些人试图将启动和提交事务封装在他们的域模型中。但是,当域模型调用其他尝试启动和提交数据库事务的域模型时,它们也会感到困惑。那么,哪种模型真正可以决定是提交事务还是回滚事务呢?如果不同的客户以不同的方式使用给定的模型,该怎么办?

服务层是针对此问题的解决方案,因为这是您可以在其中启动和提交涉及多个域模型的工作的层。

至于这种情况有多普遍,我不认为这是普遍的。大多数使用Zend Framework(或任何其他PHP或Ruby框架)的人几乎从“Active Record解决了所有问题”转移到了新的亮点,“Data Mapper解决了所有问题”。看来这个社区每五年只能学习一种新模式。他们暂时不会到达服务层。

来自@ktutnik的评论:

不,服务层模式与存储库模式不同。存储库是关于抽象数据库访问的,因此您可以使用像Collection这样的数据库。服务层是关于封装复杂的应用程序操作的。

考虑它们的另一种方法是它们与域模型的关系。资源库在域模型和数据库之间使用。而服务层使用一个或多个域模型。

Service Layer --->  Domain Model(s) ---> Repository ---> DBAL

10-07 18:50