服务是将接口写入外部系统(如 LDAP 身份存储、支付网关或应用程序管理接口)的一种方式。这是一种概念性的方式,将外部系统视为有用服务的提供者,也许具有内部行为,而不是被动的块状操作。
外观是一种包装任何内容(包括服务)以将其很好地呈现给另一个组件的方式。外墙通常用于以下情况:
- 库或组件很复杂,您的应用程序只需要它的一个子集。您的立面向应用程序呈现简化的 API
- 您正在使用多个库或组件,需要统一它们,向应用程序提供整合的 API
- 您正在使用的库具有复杂的设置或一组依赖项,并且外观将所有这些内容包装在应用程序的上下文中。
真正令人困惑的是,您可以(并且经常这样做)在一个或多个服务上创建外观。服务是组件实际访问资源的方式,外观是简化组件(如选项配置、连接等)的位。
如果你编写自己的 DAO,你可能会按照你需要的方式创建你的服务,所以编写一个外观是一个表明你做错了。如果 DAO 是由第三方构建的,并且比您的需求更复杂,那么您可以屏蔽该服务。
现在,服务是一种执行对多个DAO的调用以获得复杂数据结构的方法(我不太确定这一点,但这是我迄今为止所理解的)。
我会说DAO是一个自己的设计模式 - 参见维基百科。
如果我们将 DAO 与服务进行比较,我们得到:
- 原料药级别:
- 实施所在:
- DAO:主要在客户端上,但将数据(无行为)存储在数据库中
- 服务:主要在服务器上
- 如何调用接口
- DAO:客户端直接绑定到同一命名空间和 JVM 中的对象
- 服务:客户端只是网络、跨 VM 或跨命名空间操作的存根
...外观可以完美地访问多个DAO,以便通过提供简单的接口来执行复杂的操作,并且服务似乎类似。
一个立面可以包住DAO层,但我真的没有看到这种情况以一种有用的方式发生。最有可能的是,您需要一个API来访问对象的各个属性,遍历对象图和类似内容,而这正是DAO提供的。
交易也是如此,我知道服务是开始交易的地方......
当然可以,因为事务是由数据库和另一个组件或系统上提供的服务。
...但我同样觉得它们也可以放在立面上,毕竟,一个立面也可以调用几个DAO。
在许多方面,事务管理器服务是更复杂的后端实现的门面,在Web,应用程序,数据库和其他事务感知组件上协调事务。但是,这已经被事务服务实现抽象出来了。就我们用户而言,只有公共接口。
事实上,这就是这些设计模式的概念点 - 为用户提供适量的API,抽象出组件接口铁壁背后的实现的复杂性。
因此,哪个堆栈更有意义
控制器-立面-道控制器-服务-道
或者也许
controller-facadade-dao 有时 controller-façade-service-dao ??
- DAO是数据库的一种服务,但实际上DAO本身就是一种设计模式。
- 如果你编写自己的 DAO,则永远不需要门面。
因此,正确答案是: