5

让我们考虑一个简单的用户插入操作。我的 Spring 相关课程是UserController, UserService, UserServiceImpl, UserDAO, UserDAOImpl.

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

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

预先感谢...

4

4 回答 4

4

对于我的项目,我使用这些服务和 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
于 2013-12-23T14:56:11.623 回答
1

我认为这不是重复,我认为您使用了非常糟糕的名称(使其看起来像重复)。

Service 方法“创建”一个用户,DAO 方法“插入”或“保存”它。

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

于 2013-07-14T15:45:06.207 回答
0

除了提及名称混淆之外,您描述的结构是一个很好的起点。根据复杂性,您可以将接口类排除在外,最终得到三个类。如果您的应用程序很小(到中等),我认为这是一种合法的方法,即使它不是最佳实践。一旦你发现有很多依赖项并且你需要为你的应用程序的一部分提供某种 api 包,就引入一个接口很容易用 spring 引入,只要它不是整个应用程序。

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

于 2013-07-15T05:28:27.007 回答
0

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

因此,在您的情况下,您实际上可能是一对一的,在很多情况下,业务层 1 等同于许多 DAO 交互。

于 2013-07-14T15:41:47.083 回答