2011-10-13 27 views
7

Tôi có một số lớp mô hình DDD phong phú và được chế tạo tinh xảo, với các bất biến bất biến cuối cùng và kiểm tra tính toàn vẹn. Sự khởi đầu của đối tượng xảy ra thông qua các nhà xây dựng thích hợp, các phương thức nhà máy tĩnh và thậm chí thông qua các Nhà xây dựng.Spring MVC 3 - Ràng buộc một đối tượng 'bất biến' thành một hình thức

Bây giờ, tôi phải cung cấp biểu mẫu Spring MVC để tạo các phiên bản mới của một số lớp.

Dường như với tôi (tôi không phải là một chuyên gia) mà tôi phải cung cấp các hàm tạo và các bộ định vị của thuộc tính cho tất cả các lớp sao lưu của biểu mẫu mà tôi muốn ràng buộc.

Vì vậy, tôi nên làm gì?

Tạo các đối tượng thiếu máu chuyên dụng để tạo sao lưu và chuyển thông tin cho mô hình miền của tôi (quá nhiều cho nguyên tắc DRY ...) gọi các phương thức/trình tạo thích hợp?

Hoặc có một mecanisms mà tôi bỏ lỡ có thể tiết kiệm trong ngày của tôi? :)

Cảm ơn trước vì sự thông thái của bạn!

Trả lời

0

Có, bạn sẽ cần tạo đối tượng cho biểu mẫu để lấy tất cả đầu vào và cập nhật mô hình của bạn với các đối tượng này trong một thao tác.

Nhưng tôi sẽ không gọi đối tượng này là thiếu máu (đặc biệt là nếu bạn DDD). Các đối tượng này đại diện cho một đơn vị công việc. Vì vậy, đây là khái niệm tên miền quá!

10

Các đối tượng được sử dụng để ràng buộc với các lớp trình bày thường được gọi là kiểu xem và được DTOs nhắm vào hiển thị dữ liệu được ánh xạ từ đối tượng miền và sau đó ánh xạ đầu vào của người dùng quay lại đối tượng miền. Xem mô hình thường trông rất giống với các đối tượng miền mà họ đại diện tuy nhiên có một số khác biệt quan trọng:

  1. Dữ liệu từ các đối tượng miền có thể được san phẳng hoặc biến đổi để phù hợp với yêu cầu của một cái nhìn nhất định. Việc ánh xạ trong các đối tượng đơn giản dễ quản lý hơn là ánh xạ trong khung trình bày, chẳng hạn như MVC. Nó dễ dàng hơn để gỡ lỗi và phát hiện lỗi.

  2. Chế độ xem đã cho có thể yêu cầu dữ liệu từ nhiều đối tượng miền - có thể không có đối tượng tên miền phù hợp với yêu cầu của chế độ xem. Một mô hình khung nhìn có thể được phổ biến bởi nhiều đối tượng miền.

  3. Mô hình chế độ xem thường được thiết kế với một khung trình bày cụ thể trong tâm trí và vì vậy có thể sử dụng các thuộc tính cụ thể của khung cho ràng buộc và xác thực phía khách hàng. Như bạn đã nói, một yêu cầu điển hình là cho một hàm tạo tham số, điều này là tốt cho một mô hình khung nhìn. Một lần nữa, nó dễ dàng hơn nhiều để kiểm tra và quản lý một mô hình khung nhìn hơn một số loại cơ chế ánh xạ phức tạp.

Xem mô hình dường như vi phạm nguyên tắc DRY, tuy nhiên sau khi xem xét kỹ hơn trách nhiệm của các mô hình điểm là khác nhau, vì vậy với single responsibility principle trong tâm trí nó là thích hợp để có hai lớp. Ngoài ra, hãy xem this bài viết thảo luận về sai lầm về tái sử dụng thường do nguyên tắc DRY. Hơn nữa, các mô hình xem thực sự thiếu máu, mặc dù chúng có thể có một hàm tạo chấp nhận đối tượng miền làm tham số và phương thức tạo và cập nhật đối tượng miền bằng cách sử dụng các giá trị trong mô hình xem làm đầu vào.Từ kinh nghiệm tôi thấy rằng đó là một thực hành tốt để tạo ra một lớp mô hình xem cho mỗi thực thể miền mà sẽ được kết xuất bởi lớp trình bày. Việc quản lý cấu trúc phân cấp lớp kép của các đối tượng miền và xem mô hình dễ dàng hơn là quản lý các cơ chế ánh xạ phức tạp.

Cũng lưu ý, có các thư viện cố gắng đơn giản hóa việc ánh xạ giữa các kiểu xem và đối tượng miền, ví dụ AutoMapper cho Khuôn khổ .NET.

+0

Trong khi tôi không quan tâm quá nhiều về DRY, tôi cũng không thích các lớp không cần thiết, và sẽ tốt hơn nếu tôi có thể liên kết với thực thể miền khi thực thể tương tự với cấu trúc khung nhìn đủ tốt. Đối với các kịch bản vừa phức tạp, tốt nhất là tách các mô hình xem khỏi các thực thể miền, nhưng đối với các kịch bản rất đơn giản ("firstName", "middleName", "lastName" với thực thể Tên rất đơn giản có sẵn trong miền) có chế độ xem bổ sung mô hình lớp đơn giản có vẻ như bận rộn bận rộn/boilerplate. Đáng buồn thay, tôi không thấy nhiều thay thế. –

0

tôi giải quyết điều này bằng cách tạo ra một giao diện DTO:

public interface DTO<T> { 
    T getDomainObject(); 

    void loadFromDomainObject(T domainObject); 
} 

public class PersonDTO implements DTO<Person> { 
    private String firstName; 
    private String lastName; 

    public PersonDTO() { 
     super(); 
    } 

    // setters, getters ... 

    @Override 
    public Person getDomainObject() { 
     return new Person(firstName, lastName); 
    } 

    @Override 
    public void loadFromDomainObject(Person person) { 
     this.firstName = person.getFirstName(); 
     this.lastName = person.getLastName(); 
    } 

    // validation methods, view formatting methods, etc 
} 

này cũng dừng lại xem xác nhận và các công cụ định dạng từ rò rỉ vào mô hình miền. Tôi thực sự không thích chú thích cụ thể của Spring (hoặc các khung công cụ cụ thể khác) (@Value, v.v.) và chú thích javax.validation trong các đối tượng miền của tôi.

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