2012-12-16 11 views
5

Mamy używać DTO do wysyłania danych do iz warstwy prezentacji. Mamy warstwy jak:DTO do Entity and Entity to DTO

  • elewacji
  • appService
  • domeny

i musimy używać Dozer pomóc nam konwertować podmiot do DTO. ale mam 2 pytanie teraz:

  1. od podmiotu do DTO możemy wykorzystać dozownik, ale z dto do jednostki możemy użyć dozownik? Jeśli tak, jak?
  2. Gdzie ja mam tworzyć encje? w fasadzie lub DTOAsembler?

na przykład, muszę zarejestrować książkę. Podmiot wygląd książki jak:

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

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

opcję 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; 
} 

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

Jedna jest lepsza? Lub może być lepiej wdrożone ...?

+1

Szczerze mówiąc, trzymałbym się z dala od Dozera. Używamy go w moim bieżącym projekcie i nienawidzę go: zmusza cię do robienia pewnych rzeczy ręcznie lub całkowitego zepsucia enkapsulacji twoich obiektów przez dodanie seterów, których tam nie powinno być. A niektóre operacje muszą być wykonywane bez tego. I największy problem: jeśli zmienisz nazwę nieruchomości, wszystko się skompiluje, ale spowoduje niepoprawne wyniki tylko w środowisku uruchomieniowym. Przekształcanie DTO w byty i odwrotnie jest żmudne, bt to proste. Wykonanie go ręcznie zapewnia zachowanie enkapsulacji i pozwala na refaktoryzację. –

+0

To prawda! Jeśli coś się zmieni, można go znaleźć w środowisku uruchomieniowym! Jaka jest twoja rada na temat mojego pytania 2? – tobato

+0

Wolę mieć metodę, która po prostu kopiuje z BookDTO do Księgi i nie dba o to, skąd pochodzi Księga. –

Odpowiedz

7

Zazwyczaj nie przenosi się obiektów (reprezentacji DTO podmiotów domeny) z powrotem na serwer. Bo jeśli to zrobisz, złamiesz enkapsulację, ponieważ każdy może po prostu zastosować zmiany do DTO, a następnie wysłać informacje z powrotem.

Zamiast tego należy utworzyć interfejs usługi, który jest wykorzystywany do modyfikacji obiektów, ponieważ pozwala serwerowi , aby zastosować zmiany na jego wzór.

więc usługa jest rzeczywiście podzielony na dwie części:

  1. częścią kwerendy, która jest wykorzystywana do pobierania Dto reprezentacje wszystkich jednostek
  2. częścią polecenia, które jest używane, aby zastosować zmiany do podmiotów
+1

Dobra odpowiedź. Zgadzam się. Myślę jednak, że to, co odesłałeś na serwer, to nadal DTO. Różnica polega na tym, że nie odwzorowujesz DTO z powrotem na encję domeny. Zamiast tego, jak stwierdzasz, DTO reprezentuje polecenie, które chcesz zastosować do istniejącego podmiotu. W przypadku poleceń, które tworzą nowe jednostki, DTO dostarczyłoby danych wymaganych do utworzenia wymienionego obiektu. – eulerfx

+0

tak. Mówię tylko, że nie należy wysyłać DTO reprezentującego wszystkie informacje z domeny. – jgauffin

+1

tak, wiem, że mówisz o cqrs..Ale w tej chwili nie mamy implementacji cqrs..So..if mam wiele właściwości w książce, jak przekazać te właściwości do interfejsu usługi? Czy powinienem zapewnić interfejs, taki jak "updateName(), updateAuthor() .. updatexxx", a klient wywołuje ten interfejs jeden po drugim? – tobato