【发布时间】:2015-09-11 04:45:02
【问题描述】:
我正在开发一个 Spring MVC Web 应用程序,我将 JPA 实体保存在存储库包中,dao 和控制器类保存在单独的包中,jsp 保存在 WEB-INF 的文件夹中。
我的问题是,在这个应用程序中,什么是模型,什么是控制器,什么是视图?我应该在哪里保留业务逻辑(dao 或控制器)?明确分离业务逻辑的最佳做法是什么?
【问题讨论】:
标签: spring model-view-controller
我正在开发一个 Spring MVC Web 应用程序,我将 JPA 实体保存在存储库包中,dao 和控制器类保存在单独的包中,jsp 保存在 WEB-INF 的文件夹中。
我的问题是,在这个应用程序中,什么是模型,什么是控制器,什么是视图?我应该在哪里保留业务逻辑(dao 或控制器)?明确分离业务逻辑的最佳做法是什么?
【问题讨论】:
标签: spring model-view-controller
对于您所描述的,层如下:
对于您问题的后半部分,您实际上是在寻求基于意见的答案。但以下似乎是一种常见的模式:
如果你将业务逻辑放在控制器中,你会得到一个又胖又丑的控制器(只是在谷歌周围搜索)。即使 Spring MVC 给了你测试控制器的工具,常见的用法是避免它,因为控制器严重依赖框架,最好让业务逻辑尽可能独立于框架。永远不知道,您以后可能出于任何原因不得不使用不同的框架。
出于同样的原因将业务逻辑放在 DAO 中同样糟糕:框架独立性。
我的建议是在控制器和 DAO 之间添加一个服务层,真正的 CRUD 应用程序可能会出现异常。它是一个对框架依赖较少的层;实际上它通常不是由框架产生的原因:框架无法知道您的业务逻辑。服务类还有另一个原因,它是事务分界应该存在的 层:控制器几乎不支持 JDK 代理(这是 Spring 框架中的默认事务分界),它可能与调用更多相关比单个事务中的一种 DAO 方法。
但我必须承认,以上是我的观点,而不是大事实(不仅是我的,而且绝对是一个观点)。您当然可以找到业务逻辑非常小以至于不需要开销或服务层的用例:这只是一种架构选择,只要您知道为什么做出选择,任何可能性都可以做个好人。
【讨论】: