2015-07-14 14 views
11

Tôi bắt đầu với DDD và bạn có thể hình ảnh não của tôi đang sôi.DDD, tổ chức miền/VO và JPA

Câu hỏi của tôi liên quan đến đối tượng miền của tôi (thực thể, VO, ...) đại diện cho khái niệm/logic miền của tôi và cách duy trì/truy xuất chúng.

Sách màu xanh cho biết kho lưu trữ là cách để thể hiện các bộ sưu tập trên các đối tượng miền và chịu trách nhiệm giao tiếp với lớp cơ sở hạ tầng. Tôi cũng đọc tại một số bài cơ sở hạ tầng lớp là nơi bạn phải sử dụng ngủ đông, JPA hoặc bất cứ điều gì.

Sau đó, tôi thấy ví dụ Spring-data-jpa này http://spring.io/guides/gs/accessing-data-jpa/ và tôi trở nên điên khùng.

Khẩu hiệu nói Spring-data-jpa là tạo kho dễ dàng và các mẫu trước đó dường như hợp nhất chú thích JPA vào đối tượng miền (số customer).

Mẫu có đúng không? hoặc tôi có đúng không?

Nếu tôi đúng và lĩnh vực cơ sở hạ tầng và phải được tách ra, có nghĩa là để lưu trữ một khách hàng, tôi phải có:

  • một lớp Customer trong lớp tên miền của tôi (đại diện cho một khách hàng và có tất cả các hoạt động logic)
  • một CustomerRepository un lớp tên miền của tôi (mà lấy hoặc các cửa hàng khách hàng từ lớp cơ sở hạ tầng)
  • một lớp Customer trong lớp cơ sở hạ tầng, có lẽ chú thích với @Entity
  • Một số CustomerReposityJPA biết cách lưu trữ/truy xuất khách hàng từ cơ sở dữ liệu.

Cảm ơn bạn đã giải thích rõ.

+0

DDD có nghĩa là gì? – vels4j

+0

Thiết kế định hướng miền. –

Trả lời

2

Tôi không thể thấy liên kết bạn đã đăng và tôi chưa bao giờ áp dụng thiết kế theo hướng tên miền cho thế giới Java. Về lý thuyết những gì bạn cần là tổng hợp Customer trong lớp miền. Trong lớp miền của bạn có không gian cho kho lưu trữ (được dùng làm giao diện), vì vậy bạn sẽ có ICustomerRepository. Có lẽ bạn sẽ có nguyên mẫu bốn cho các vấn đề kiên trì thông thường:

GetById(CustomerId id); 
Add(Customer c); 
Delete(Customer c); 
Update(Customer c); 

Trong lớp cơ sở hạ tầng bạn sẽ cung cấp cho cơ thể (ví dụ CustomerRepository), trong lớp infrastracture bạn có thể cặp đôi mình với cái gì công nghệ (ví dụ JPA).

Lớp miền PHẢI hoàn toàn không biết về công nghệ được sử dụng trong cơ sở hạ tầng. Làm như vậy bạn có thể thay đổi đầy đủ các chi tiết thực hiện có (hầu như) không có rắc rối.

+0

Có ai thực sự nhìn thấy một dự án ví dụ thực hiện điều này không? Tôi dường như không thể tìm thấy bất kỳ mẫu thực sự có thực thể miền (không nhất thiết liên quan đến các bảng DB) được mô hình hóa trong lớp miền và sau đó trong lớp cơ sở hạ tầng, các đối tượng JPA @Entity ánh xạ tới các bảng db. Các giao diện kho lưu trữ sẽ được triển khai trong mô-đun cơ sở hạ tầng đó và nên biết cách ánh xạ giữa các thực thể JPA với các mô hình miền. – Mustafakidd

10

Trong DDD, một kho lưu trữ là một đối tượng tham gia vào miền nhưng thực sự tóm tắt một số cửa hàng sao lưu.

Nếu bạn chú thích miền của bạn đối tượng bằng chú thích JPA, cơ chế kiên trì của bạn đã tràn vào miền của bạn. Bạn đã gắn kết cấu trúc miền của bạn với cấu trúc bền vững của bạn mà không phải là lý tưởng.

JpaCustomerRepository (thực hiện ICustomerRepository) của bạn có thể ánh xạ các lớp miền không được viện dẫn (Customer) vào một đại diện JPA được chú thích - khách hàng JPA.Điều này giữ cho chú thích ra khỏi các lớp miền của bạn, vì vậy là sạch hơn. Nó cho phép bạn thay đổi cấu trúc persistence JPA độc lập với cấu trúc miền của bạn. Chi phí cho lợi ích này là sự phức tạp của mã ánh xạ.

interface ICustomerRepository {} 

class JpaCustomerRepository implements ICustomerRepository { 
    void save(Customer customer) { 
      JpaCustomer jpaCustomer = map(customer); 
      save(jpaCustomer); 
    } 
} 

class Customer {} 

class JpaCustomer {} 
+3

Chi phí cao, có sự trùng lặp mã: Hai lớp khách hàng có thuộc tính cần được ánh xạ. Âm thanh như rất nhiều mã soạn sẵn. Khả năng là trạm biến áp của nhà cung cấp JPA để biện minh cho nỗ lực bổ sung đó? –

+1

Tôi xem Chú thích JPA là thông tin khai báo. Trong trường hợp bạn cần thay thế nhà cung cấp JPA của mình, bạn có thể xóa chú thích JPA khỏi các thực thể miền của mình không? – Armando