web-dev-qa-db-fra.com

Contrôleur appelant plusieurs services

J'ai quelques couches dans mon application Web: présentation, service, DAO, domaine.

Les services appellent des objets DAO qui lisent les données d'une base de données/fichier.

J'ai un Controller qui doit récupérer les données de différents Services et les définir dans le cadre du Response.

Dois-je mettre la logique pour appeler différents services dans la méthode du contrôleur ou dois-je créer une sorte de Facade qui à son tour appellera différents services? Si oui, dans quelle couche la façade devrait-elle résider?

@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

À mon humble avis, le contrôleur devrait être la "façade" elle-même, ce qui signifie que le contrôleur devrait décider quel service appeler, et les services devraient être chargés de générer l'objet de réponse.

Ce que je ferais, c'est de définir une méthode par action, et de discriminer le service en utilisant REST naming, quelque chose comme ceci:

@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