it-swarm.com.de

Controller, der mehrere Dienste aufruft

Ich habe einige Ebenen in meiner Webanwendung: Präsentation, Service, DAO, Domäne.

Dienste rufen DAO-Objekte auf, die Daten aus einer Datenbank/Datei lesen.

Ich habe ein Controller, das Daten von verschiedenen Services abrufen und als Teil des Response festlegen muss.

Sollte ich die Logik zum Aufrufen verschiedener Dienste in die Controller-Methode einfügen oder sollte ich eine Art Facade erstellen, die wiederum verschiedene Dienste aufruft? Wenn ja, in welcher Ebene sollte sich die Fassade befinden?

@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

Meiner bescheidenen Meinung nach sollte der Controller die "Fassade" selbst sein, dh der Controller sollte entscheiden, welcher Dienst aufgerufen werden soll, und die Dienste sollten für die Generierung des Antwortobjekts verantwortlich sein.

Was ich tun würde, ist, eine Methode pro Aktion zu definieren und den Dienst mit REST naming, so etwas zu unterscheiden:

@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