基本的な階層型Webアプリケーションのフローを考え出そうとしていて、競合する情報をオンラインで読んでいます。私が理解しようとしているのは、なんらかのマッパーを使用して、DAOからサービスレイヤーへのDTOオブジェクトを引き続き使用する利点があるかどうかです。
私が予測する基本的なフローは次のとおりです。
DTOに従った場合、DAOはエンティティではなくDTOを返します。 (少なくともJavaでは)エンティティが注釈付きPOJOになり、メモリフットプリントが非常に小さくなったため、いくつかの読み取りを行った後、DTOが少し機能しなくなったようです。
これは事実ですか、それともDTOを使用してドメインオブジェクトをDAOレイヤー内に完全にカプセル化する必要がありますか?その場合、サービスレイヤーはDAOに何を渡しますか?
本当にありがとう!
私によると、たとえばJPAによって管理されるBeanなどの永続化可能なPOJOを渡すことは、良い習慣ではありません。
どうして?
主な理由は3つあります。
サービスレイヤーにエンティティを対応するDTOに双方向で変換させることをお勧めします。 DAOはまだエンティティを返します(変換を確実にするのはその仕事ではありません)。
この議論が繰り返し出てくると思う理由の1つは、必要なすべてのデータを含むオブジェクトを取得し、それを同一またはほぼ同一に見えるオブジェクトに変換することは非常に面倒なことのように思われるためですあなたは引き渡します。
それは本当です、それはピタです。しかし、そうする理由はいくつかあります(上記に列挙したもの以外に)。
ただし、変換ロジックをコンバータークラスのコレクションにカプセル化すると、かなり効率的に管理できます。
LambdaJを見て、 'convert(domainObj、toDto)'を実行できます。コレクションで使用するために、このオーバーロードがあります。以下は、それを利用するコントローラーメソッドの例です。ご覧のとおり、それほど悪くはありません。
@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);
}