私の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();
}
}
私の控えめな意見では、コントローラーは「ファサード」自体である必要があります。つまり、コントローラーは呼び出すサービスを決定し、サービスは応答オブジェクトの生成を担当する必要があります。
アクションごとにメソッドを定義し、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.
}
}