J'ai essayé de trouver un flux pour une application Web à plusieurs niveaux de base et j'ai lu des informations contradictoires en ligne. Ce que j'essaie de comprendre, c'est s'il y a un avantage à continuer à utiliser des objets DTO de votre couche DAO vers Service via l'utilisation d'une sorte de mappeur.
Le flux de base que je prévois est le suivant:
Si le DTO était suivi, DAO transmettrait un DTO et non l'entité. Après avoir fait quelques lectures, il semble que le DTO soit légèrement disparu puisque (au moins en Java) les entités sont devenues des POJO annotés, ce qui signifie que leur empreinte mémoire est devenue très petite.
Est-ce le cas, ou faut-il utiliser des DTO pour encapsuler complètement les objets de domaine au sein de la couche DAO et, si tel est le cas, que passerait la couche service au DAO?
Merci beaucoup!
Selon moi, passer un POJO persistant, comme par exemple un bean géré par JPA, n'est pas LA bonne pratique.
Pourquoi?
Je vois trois raisons principales:
Je préfère laisser ma couche de service convertir les entités en DTO correspondant dans les deux sens. DAO retourne toujours l'entité (ce n'est pas son travail d'assurer la conversion).
L'une des raisons pour lesquelles je pense que cette discussion revient à plusieurs reprises est parce que cela semble être une grave douleur dans le cul de prendre un objet avec toutes les données dont vous avez besoin et de le convertir en un objet qui semble identique ou presque identique à celui vous remettez.
C'est vrai, c'est un PITA. Mais il y a plusieurs raisons (en plus de celles énumérées ci-dessus) pour le faire.
Mais, vous pouvez le gérer assez efficacement si vous encapsulez la logique de traduction dans une collection de classes de conversion
Jetez un œil à lambdaJ où vous pouvez faire 'convertir (domainObj, toDto)' il y a une surcharge de ceci pour une utilisation avec des collections. Voici un exemple de méthode de contrôleur qui l'utilise. Comme vous pouvez le voir, ça n'a pas l'air si mal.
@GET
@Path("/{id}/surveys")
public RestaurantSurveys getSurveys(@PathParam("id") Restaurant restaurant, @QueryParam("from") DateTime from, @QueryParam("to") DateTime to) {
checkDateRange(from, to);
MultiValueMap<Survey, SurveySchedule> surveysToSchedules = getSurveyScheduling(restaurant, from, to);
Collection<RestaurantSurveyDto> surveyDtos = convert(surveysToSchedules.entrySet(), SurveyToRestaurantSurveyDto.getInstance());
return new RestaurantSurveys(restaurant.getId(), from, to, surveyDtos);
}