【发布时间】:2011-09-02 02:07:24
【问题描述】:
在我的应用程序中,我通常访问 DAO 层以获取/保存或更新对象到它的存储库,并且我使用 Service 层来执行更复杂的操作.
所以我的问题是:从 Controller 层访问 DAO 层是否正确(根据最佳实践和设计/架构模式),或者我应该通过Service层绕过它?谢谢!
【问题讨论】:
标签: design-patterns architecture
在我的应用程序中,我通常访问 DAO 层以获取/保存或更新对象到它的存储库,并且我使用 Service 层来执行更复杂的操作.
所以我的问题是:从 Controller 层访问 DAO 层是否正确(根据最佳实践和设计/架构模式),或者我应该通过Service层绕过它?谢谢!
【问题讨论】:
标签: design-patterns architecture
我想我是这里的偶像破坏者。我同意到目前为止给出的答案,即绕过服务层原则上很好,但在我看来,不是 实际上 .
主要原因是很难预测哪天会引入业务逻辑。例如,我认为“记录”是业务逻辑。如果我想引入日志或日志或限制访问,我不想在 DAO 层中这样做。但是如果我有绕过 DAO 层的代码,那么现在所有这些代码都需要重构。
DAO 层还有另一个优点,我经常发现它很有用。有些操作我可能想暴露给服务层,但不想暴露给它上面的任何层。
作为一个例子,我可以想象一个返回加密密码的 DAO 层,但一个服务层只允许您判断您传入的加密密码是否与数据库中的密码匹配。我不希望控制器层能够获取有效的加密密码 - 我看到了不必要的暴露。
因此,虽然我可能会同意,如果您绝对知道您永远不需要引入业务逻辑(如我所描述的),并且如果您有零需要隐藏一些数据访问操作而暴露其他操作.. . 然后通过各种方式将 DAO 层暴露给更高层。
我的观点是,在实践中,你不能“知道”这一点,也不应该假设。
【讨论】:
你应该绕过它到服务层。
这样做的原因:
【讨论】:
理论上:在 MVC 架构模式的上下文中,数据访问层 (DAO) 和服务层之间没有明显的区别。 Service 层和 DAO 层都可以看作是 MVC 中的“模型”。服务层可以很好地实现业务逻辑、复杂的验证等——但它仍然是访问数据的层!只要您在模型、视图和控制器对象之间保持清晰的关注点分离,就可以从控制器对象访问 DAO 层。
在实践中:我已经看到了这两种情况。如果您有一个带有简单数据模型的小型应用程序,那么直接从控制器中使用 DAO 层会很有意义。但是,随着业务逻辑变得复杂,或者如果您的模型由多个应用程序共享,则将业务委托和 DAO 分解出来以重用组件、最大限度地减少更改时的影响、增加两者之间的灵活性会更有意义组件等。这将由相关系统的技术架构决定。
【讨论】:
我认为,如果不需要从 Service 层进行任何类型的处理,那么让 Controller 层直接访问 DAO 是没有问题的。但它确实应该至少有一些处理工作要做,比如在弄乱数据库之前对输入数据进行服务器验证。
【讨论】: