什么是使用Controller,Service和Repository注释的最佳实践?

Jac*_*ack 6 java spring spring-mvc

我十分赞同的使用混淆@Controller,@Service@Repository在Spring-MVC.

我有几个问题,非常感谢让他们回答.

  • 我知道控制器用于从视图接收请求并向视图发出请求以向用户显示结果.我的问题是,我可以在具有控制器注释的类中进行哪些扩展处理?我是否应该在服务注释类中执行所有处理并保留控制器以接收请求并仅返回响应?我想知道什么是最佳做法?

    假设我需要调用不同的服务注释类方法来处理结果,如果我从控制器调用它们或将它们传递给服务注释类?(这只是一个例子)

  • 如果我不想处理结果并且只是愿意向数据库发送请求并接收结果,那么我是否仍需要在控制器和存储库之间安装服务注释类?

    假设我收到了产品ID,想要检索并显示产品的详细信息.(这只是一个例子)

Adr*_*hum 8

我认为这几乎不是任何“最佳方法”,而是适合您需要的方法。这是我在过去的项目中使用的方法,这种方法基于领域驱动设计。

  1. 表示层:控制器(@Controller)

    仅负责呈现业务功能(在应用程序服务层中提供)。因此主要是委托给应用服务,进行数据按摩和与表示相关的逻辑。

  2. 应用服务层:应用服务(@Service)

    从高层次上讲,它代表业务用例。因此在方法上设置了事务边界(因为每个方法都是一个用例,因此是一个工作单元)。由于我反对使用贫血模型,真正的业务逻辑应该在领域模型层。这一层主要利用领域层来组成一个有意义的用例。主要是数据转换(取决于您的设计),以及对域层工件的委托。

  3. 领域层:模型、领域服务(@Service)、存储库(@Repository)等

    业务逻辑位于域模型或域服务中。存储库是检索域模型的工件。

  4. 基础设施层

    某些领域工件的基础设施依赖实现。

回到你的问题:

  • 没有对与错。如果您正在制作一个完全独立的简单应用程序,那么拆分控制器和应用程序服务层的角色可能没有任何好处。此外,对于那些习惯于贫血模型开发的人来说,您可能需要一个服务来放置您的业务逻辑。所以,您需要问问自己,在您的设计中加入某个层的目的是什么,是吗?对你真正有意义的东西。对于我的方法,我认为对于哪个层要做什么已经很清楚了。如果您愿意,可以将其作为参考。

  • 类似的回答:如果你在你的Controller中做Presentation+ApplicationService的作用,没有什么特别的理由再编一个Service。但是如果你想维护一个表现中立的应用服务层,那么你应该通过你的应用服务提供那些“CRUD”操作。


Dan*_*own 3

好吧取决于需求,我认为你最好保持控制器干净,它们用于表示,所以你应该只保留与表示层相关的任何内容,但是,如果你需要将输入传递给服务类并从还有调用其他服务方法,我想说不要在服务类中创建新方法,只需直接调用服务方法即可。

假设这些方法位于服务类中,我认为将输入发送到服务类并在其中包含以下代码是没有意义的。我建议将此代码保留在控制器中并调用以下方法:

if(input is valid){
      result1 = serviceClass.dothisstuff(input);
      result2 = serviceClass.thenthisstuff(result1);
}else{
      result1 = serviceClass.dothosestuff(input);
      result2 = serviceClass.thenthosestuff(result1);
}
Run Code Online (Sandbox Code Playgroud)

我想说,为了未来的需求,始终使用所有三层。