2012-12-16 40 views
5

Chúng tôi sử dụng DTO để gửi dữ liệu đến và từ lớp trình bày. Chúng tôi có các lớp như:DTO để thực thể và thực thể cho DTO

  • mặt tiền
  • appService
  • miền

Và Chúng tôi có sử dụng Dozer để giúp chúng tôi chuyển đổi đơn vị để dto. Nhưng tôi có 2 câu hỏi ngay bây giờ:

  1. từ thực thể đến chúng tôi có thể sử dụng dozer, nhưng từ dto đến thực thể chúng ta có thể sử dụng dozer? Nếu có, làm thế nào?
  2. Tôi tạo ra thực thể ở đâu? ở mặt tiền hoặc DTOAssembler?

ví dụ: tôi phải đăng ký một cuốn sách. cuốn sách Entity giao diện của như:

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

và chúng tôi hav một 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? 
    } 
} 

tùy chọn 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; 
} 

tùy chọn 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; 
} 

Với một cái tốt hơn? Hoặc nó có thể được thực hiện một cách tốt hơn ..?

+1

Thành thật mà nói, tôi sẽ tránh xa Dozer. Chúng tôi đang sử dụng nó trong dự án hiện tại của tôi, và tôi ghét nó: nó buộc bạn phải làm một số thứ bằng tay, hoặc để hoàn toàn phá vỡ đóng gói của các đối tượng của bạn bằng cách thêm setters mà không nên có. Và một số hoạt động phải được thực hiện mà không có nó anyway. Và vấn đề lớn nhất: nếu bạn tình cờ đổi tên một thuộc tính, mọi thứ sẽ biên dịch tốt, nhưng sẽ tạo ra kết quả không chính xác chỉ khi chạy. Chuyển đổi DTO thành các thực thể và ngược lại là tẻ nhạt, bt nó đơn giản. Làm theo cách thủ công đảm bảo đóng gói được bảo toàn và cho phép tái cấu trúc. –

+0

Đó là sự thật! Nếu bất cứ điều gì thay đổi, nó có thể được tìm thấy trong thời gian chạy! Lời khuyên của bạn về câu hỏi 2 của tôi là gì? – tobato

+0

Tôi muốn có một phương thức chỉ sao chép từ một BookDTO đến một cuốn sách, và không quan tâm đến Sách đến từ đâu. –

Trả lời

7

Thông thường bạn không chuyển các đối tượng (đại diện DTO của các thực thể miền) trở lại máy chủ. Bởi vì nếu bạn làm như vậy bạn phá vỡ đóng gói vì ai cũng có thể áp dụng thay đổi cho DTO và sau đó gửi lại thông tin. Thay vào đó, bạn nên tạo giao diện dịch vụ được sử dụng để sửa đổi các đối tượng vì nó cho phép máy chủ áp dụng các thay đổi cho mô hình của nó.

Vì vậy, các dịch vụ được thực sự tách ra thành hai phần:

  1. Một phần truy vấn được sử dụng để lấy DTO cơ quan đại diện của tất cả các thực
  2. Một phần lệnh được sử dụng để áp dụng thay đổi cho các đối tượng
+1

Câu trả lời hay. Tôi đồng ý. Tuy nhiên, tôi nghĩ rằng những gì bạn gửi lại cho máy chủ vẫn là một DTO. Sự khác biệt là bạn không ánh xạ một DTO trở lại thực thể tên miền. Thay vào đó, khi bạn phát biểu, DTO đại diện cho lệnh bạn muốn áp dụng cho một thực thể hiện có. Đối với các lệnh tạo các thực thể mới, DTO sẽ cung cấp dữ liệu cần thiết để tạo thực thể được cho biết. – eulerfx

+0

vâng. Tôi chỉ nói rằng bạn không nên gửi một DTO đại diện cho tất cả các thông tin trong thực thể miền trở lại. – jgauffin

+1

vâng, tôi biết bạn nói về cqrs..Nhưng tại thời điểm này, chúng tôi không có một cqrs thực hiện .. Vì vậy .. nếu tôi có rất nhiều tài sản trong cuốn sách, làm thế nào để vượt qua các tài sản vào một giao diện dịch vụ? Hoặc tôi nên cung cấp giao diện như 'updateName(), updateAuthor() .. updatexxx' và khách hàng gọi giao diện này từng cái một? – tobato

Các vấn đề liên quan