service-dao模式的最佳实践是什么?

时间:2013-07-14 13:15:38

标签: spring service duplication genericdao

让我们考虑一个简单的用户插入操作。我的Spring相关课程是UserControllerUserServiceUserServiceImplUserDAOUserDAOImpl

在控制器端,我拨打userService.insert(new User())并在userService.insert()方法中拨打userDAO.insert(user)。我认为这种模式存在方法重复。

有没有办法避免方法重复?可能是我的编码有问题。我等你的回复,经历......

提前感谢...

4 个答案:

答案 0 :(得分:3)

对于我的项目,我使用这些服务和DAO层。 我不知道这是一种最佳做法。

这是一个示例创建操作级别:

[View Layer]
  * Simple HTML form or AJAX request
      |
      | User submits create form. Browser sends POST data
      | to controller.
      |
[User Controller]
  * Authentication and authorization. @Security annotations can be for method security.
  * Controller tries to bind POST data to UserCreateForm. If can't Validation exception occurs.
  * Validates bind data according to validation annotations. @Required ...
      |
      | (UserCreateForm) is POJO class which has validation annotations.
      | It is similar but different from domain objects.
      |
[User Controller]
  * Logs errors via Logging API (logback, slf4j, log4j ...)
  * Copies form values from UserCreateForm to User domain object
  * Calls service methods.
  * Passes messages and model objects to desired view page.
      |
      | (User) is POJO class. called domain object, contains ORM annotations if using JPA
      | or hibernate. It is similar but different from form/command objects. It can be
      | generated automatically by tools (IDE, hibernate tools ...)
      |
[UserService & UserServiceImpl]
  * Calls multiple DAO methods in one transaction. If an error occurs. rolls back.
  * Contains business logic
  * Doesn't know the database technology.
      |
      | (User) domain object.
      |
[UserDAO & HibernateUserDAOImpl || JpaUserDAOImpl || OracleJdbcDAOImpl ...]
  * DAO layer knows the persistence technology
  * Operations are atomic

答案 1 :(得分:1)

我认为这不重复,我认为你使用了非常糟糕的名字(使它看起来像重复)。

服务方法“创建”用户,DAO方法“插入”或“保存”它。

现在您看到“创建”和“插入”是两种不同的操作,具有不同的范围和不同的抽象级别。所以这没有重复。

答案 2 :(得分:0)

您所概述的内容看起来很好,适合业务服务模式的许多实现。可能导致您混淆的是,通常用于描述方法/功能的语言在每个层之间是不同的。例如,'insert'是一个更多的数据持久性术语,而业务/服务层想要“创建”一个用户。差异的原因是通常概念上的差异。在服务层“创建”用户只是一个“对象”,一个“用户”,而在DAO层,它实际上是几个步骤; 1.创建'用户',2。在不同的表中创建他们的'地址',3。将它们添加到任何安全组。

所以在你的情况下你可能实际上有一对一,在很多情况下,业务层1等同于许多DAO交互。

答案 3 :(得分:0)

除了提及名称的混淆之外,您描述的结构是一个很好的起点。根据复杂性,您可以将接口类保留在外,最终会有三个类。如果你的申请很小(中等)我认为这是一种合法的方法,即使这不是最佳做法。一旦你发现有很多依赖关系,并且你需要某种api软件包,你需要某种类型的api软件包很容易引入spring,因为它不是整个应用程序。

您必须记住的另一件事是,您不需要为每个用例乘以这个完整的类链。广义的SimpleCrudDao和SimpleEntityService非常好。然后,一旦这个SimpleEntityService不够用,您就可以开始创建特定的那些,例如具有createUserAndTransferEntitiesAndUpdateWhatsoever方法的UserService。