web-dev-qa-db-ja.com

複数のサービスを呼び出すコントローラー

私のWebアプリケーションには、プレゼンテーション、サービス、DAO、ドメインのいくつかのレイヤーがあります。

サービスは、データベース/ファイルからデータを読み取るDAOオブジェクトを呼び出します。

異なるControllerからデータをフェッチしてServicesの一部として設定する必要があるResponseがあります。

Controllerメソッドで異なるサービスを呼び出すロジックを配置する必要がありますか、それとも別のサービスを呼び出す、ある種のFacadeを作成する必要がありますか?もしそうなら、ファサードはどのレイヤーにあるべきですか?

@Path("/")
public class MyController {

  @Autowired
  private FirstService firstService;

  @Autowired
  private SecondService secondService;

  @GET
  public Response getData(@QueryParam("query") final String query) {
      final MyResponse response = new MyResponse();

      // Service 1
      final String firstData = firstService.getData(query);
      response.setFirstData(query);


      if (someCondition) {
        // Service 2
        final String secondData = secondService.getData(query);
        response.setSecondData(query);
      }

      // more Service calls maybe

      return Response.status(Response.Status.OK).entity(response).build();
  }

}
10
Diyarbakir

私の控えめな意見では、コントローラーは「ファサード」自体である必要があります。つまり、コントローラーは呼び出すサービスを決定し、サービスは応答オブジェクトの生成を担当する必要があります。

アクションごとにメソッドを定義し、RESTネーミングを使用して、次のようにサービスを区別します。

@Path("/")
public class MyController {

  @Autowired
  private FirstService firstService;

  @Autowired
  private SecondService secondService;

  @RequestMapping(value = "/service1/{query}", method = {RequestMethod.GET})
  public Response getData(@RequestParam("query") final String query) {

      return firstService.yourMethod(); // inside the service you handle the response.
  }

  @RequestMapping(value = "/service2/{query}", method = {RequestMethod.GET})
  public Response getData(@RequestParam("query") final String query) {

      return secondService.another(); // inside the service you handle the response.
  }

}
7
lJoSeTe4ever