5

DTOを使用して、プレゼンテーション層との間でデータを送受信します。次のようなレイヤーがあります。

  • ファサード
  • appService
  • ドメイン

また、エンティティをdtoに変換するためにDozerを使用しています。しかし、私は今2つの質問があります:

  1. エンティティからdtoまではドーザーを使用できますが、dtoからエンティティまではドーザーを使用できますか?はいの場合、どのように?
  2. どこでエンティティを作成する必要がありますか?ファサードまたはDTOAssemblerで?

たとえば、本を登録する必要があります。本のエンティティは次のようになります。

Book{
   public Book(BookNumber number,String name){
      //make sure every book has a business number,
      //and the number can't change once the book is created.
      this.bookNumber = number;
      ..
   }
}

そして私たちはDTOAssemblerを持っています:

BookDTOAssembler{

  BookDTO toDAO(bookEntity){
  ...
  }
  BookEntiy fromDTO(book DTO,BookRepository bookRepository){
    //1.Where should i create book entity? 
    //2.Is there any effective way to convert dto to entity in java world?
  }
}

オプション1

the BookManagedFacade has a registerBook function:
public registerBook(bookDTO){
   Book book = BookDTOAssembler.fromDTO(book DTO);
}

//Create book in BookDTOAssembler.fromDTO 
public static BookEntiy fromDTO(BookDTO bookDTO,BookRepository bookRepository){
    //book is never registered 
    if (0==bookDTO.getBookID()){
       Book book = new Book(bookRepository.generateNextBookNumber(),bookDTO.getName());
    }else{
       //book is been registed so we get it from Repository
       book = bookRepository.findById(bookDTO.getBookID()); 
    }
    book.setAuthor(bookDTO.getAuthor);
    ...
    return book;
}

オプション2

the BookManagedFacade has a registerBook function:
public registerBook(bookDTO){
   Book book = new Book(bookRepository.generateNextBookNumber(),bookDTO.getName());
   book = BookDTOAssembler.fromDTO(book DTO,book);
}

//add another function in BookDTOAssembler.fromDTO 
public static BookEntiy fromDTO(BookDTO bookDTO,Book book){
    book.setAuthor(bookDTO.getAuthor);
    ...
    return book;
}

1つで良いですか?またはそれはより良い方法で実装することができます..?

4

1 に答える 1

7

通常、オブジェクト(ドメインエンティティのDTO表現)をサーバーに転送しません。これを行うと、誰でもDTOに変更を適用して情報を送り返すことができるため、カプセル化が破られます。

代わりに、サーバーがモデルに変更を適用できるようにするため、オブジェクトの変更に使用されるサービスインターフェイスを作成する必要があります。

したがって、サービスは実際には2つの部分に分割されます。

  1. すべてのエンティティのDTO表現をフェッチするために使用されるクエリ部分
  2. エンティティに変更を適用するために使用されるコマンド部分
于 2012-12-18T13:45:05.940 に答える