我有设计问题,当实现1个简单的web应用程序。我使用struts2 web控制器,spring的IOC和Hibernate作为持久层。
因为这个web应用程序在乞求方面非常简单。所以我只有两层:1 DAO层,用来访问数据库。几乎每个表都有相关的DAO。2动作层。用户struts2。我对这个架构很满意,因为它可以快速实现我的web应用程序。随着项目变得越来越大,我发现动作层变得越来越大和复杂,并且很难重用。我尝试创建服务层,以解决复杂的业务逻辑很好,但我的应用程序仍然有很多简单的逻辑。例如:加载1个对象,保存1个对象,按一定条件获取集合并显示在网页上。如果给出每种简单数据库访问方法都有相应的服务方法。仍然需要花费大量的精力。如何解决这个问题?而且我认为,如果服务层存在,直接调用DAO层仍然不适合我的应用程序设计。对于这类小型web应用程序,有什么好的解决方案吗?
发布于 2013-12-11 16:01:45
在规划web应用程序中的不同层时,最好在不提供身份上下文的情况下明确保护模型中的属性和关联不被操纵。
这既不应该在DAO层中完成,也不应该在控制器中完成。您应该将DAO层包装在服务层中,并让控制器只与服务通信,而不是直接与DAO通信。
保护您的模型免受不必要的操作,例如,您需要调整在Controller和Service之间传递的数据结构中的信息量,以适应您想要执行的实际操作。
例如:在集合中添加或删除元素是服务中的显式操作,它不会通过将集合作为DAO对象的成员操作并将该DAO传递回服务来隐式发生。
相反,您的服务可能如下所示:
+ getAllCompanies(): CompanyType[*]
+ getAllEmployeesOfCompany(c: CompanyType) : EmployeeType[*]
+ addEmployeeToCompany(e: EmployeeType, c: CompanyType)
+ removeEmployeeFromCompany(e: EmployeeType, c: CompanyType)
这种体系结构的额外好处是,服务层充当事务的边界。使用控制器的方法作为事务的边界实际上是一个非常糟糕的习惯。您甚至可以将其称为反模式。为什么?因为例如,这将意味着当您的客户端挂断时,它将回滚您的事务。在99%的案例中,这显然是不受欢迎的。
发布于 2013-12-18 03:48:21
正如@mwhs评论的那样,Apache Isis为你的应用程序分层提供了大量的指导。要弄清楚它是否符合您的需求,您可以浏览一下我在最近的一次会议上介绍的这个tutorial。
https://stackoverflow.com/questions/20513189
复制相似问题