DTO to Entity And Entity to DTO

好久不见. 提交于 2019-12-21 16:54:03

问题


We're to use DTO's to send data to and from the presentation layer. We have layers like:

  • facade
  • appService
  • domain

And We have use Dozer to help us convert entity to dto. But i have 2 question now:

  1. from entity to dto we can use dozer, but from dto to entity can we use dozer? If Yes, How?
  2. Where shoud i create entity? in facade or DTOAssembler?

for example,I have to register a book. the book Entity look's like:

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;
      ..
   }
}

and we hav a 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?
  }
}

option 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;
}

option 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;
}

With one is better? Or It can be implemented in a better way..?


回答1:


Typically you do not transfer objects (DTO representations of the domain entities) back to the server. Because if you do so you break encapsulation since anyone could just apply changes to the DTOs and then send the information back.

Instead you should create a service interface which is used to modify the objects since it allows the server to apply changes to it's model.

So the service is really splitted up into two parts:

  1. A query part which is used to fetch DTO representations of all entities
  2. A command part which is used to apply changes to the entities


来源:https://stackoverflow.com/questions/13899291/dto-to-entity-and-entity-to-dto

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!