Tôi đã đọc một câu hỏi tương tự trên SO: How update an entity inside Aggregate, nhưng tôi vẫn không chắc chắn cách giao diện người dùng nên tương tác với các thực thể bên trong tổng hợp.Cập nhật thực thể bên trong tổng hợp
Giả sử tôi có một số User
, với một bó là Address
es. Người dùng là gốc tổng hợp, trong khi Địa chỉ chỉ tồn tại trong tổng hợp.
Trên web inteface, người dùng có thể chỉnh sửa địa chỉ của mình. Về cơ bản, những gì xảy ra là:
- Người dùng nhìn thấy một danh sách các địa chỉ trên giao diện web của nó
- anh ta nhấp vào một địa chỉ, và được chuyển hướng đến trang này:
edit-address?user=1&address=2
- Trên trang này, anh nhận được một hình thức nơi anh ta có thể sửa đổi địa chỉ này.
tôi chúng tôi quyết định bỏ qua các gốc tổng hợp, đây sẽ là đơn giản:
- Chúng tôi sẽ trực tiếp tải các
Address
với nóId
- Chúng tôi sẽ cập nhật nó, sau đó lưu nó
Vì chúng tôi muốn thực hiện theo cách DDD, chúng tôi có các giải pháp khác nhau:
Hoặc chúng ta hỏi người dùng để có được địa chỉ này bằng cách Id:
address = user.getAddress(id);
address.setPostCode("12345");
address.setCity("New York");
em.persist(user);
Vấn đề với phương pháp này là, IMO, rằng gốc tổng hợp vẫn không có quyền kiểm soát nhiều hơn những gì được thực hiện với địa chỉ. Nó chỉ trả về một tham chiếu đến nó, vì vậy nó không khác nhiều so với việc bỏ qua tổng hợp.
Hoặc chúng ta báo cho tổng hợp để cập nhật địa chỉ hiện có:
user.updateAddress(id, "12345", "New York");
em.persist(user);
Bây giờ tổng hợp có quyền kiểm soát những gì đang thực hiện với địa chỉ này, và có thể mất bất kỳ hành động cần thiết mà đi với việc cập nhật địa chỉ.
Hoặc chúng tôi xử lý địa chỉ như một đối tượng giá trị , và chúng tôi không cập nhật
Address
của chúng tôi, nhưng thay vì xóa và tạo lại:user.removeAddress(id);
address = new Address();
address.setPostCode("12345");
address.setCity("New York");
user.addAddress(address);
em.persist(user);
Giải pháp cuối cùng này có vẻ thanh lịch, nhưng có nghĩa là Địa chỉ không thể là Thực thể. Sau đó, nếu cần phải được coi là một thực thể, ví dụ: vì một đối tượng kinh doanh khác trong tổng hợp có tham chiếu đến nó?
Tôi chắc chắn tôi thiếu một số thứ ở đây để hiểu chính xác khái niệm tổng thể và cách sử dụng trong các ví dụ thực tế, vì vậy, vui lòng cho ý kiến của bạn!
Cảm ơn. Điều đó thực sự có ý nghĩa, mặc dù tôi không chắc chắn làm thế nào để thực hiện một phương thức 'changeAddress()'. Ví dụ trên là sự đơn giản hóa và địa chỉ có thể bao gồm một tá trường, bao gồm tên đường phố, số tòa nhà, điểm 'LatLng' cho vị trí chính xác trên bản đồ, v.v.Bạn đề xuất gì sau đó, đặt tất cả các tham số này vào các đối số phương thức, hoặc tạo một kiểu đối tượng tạm thời nào đó từ biểu mẫu (nó cũng là một đối tượng 'Address'?) Và chuyển nó thành đối số cho phương thức này? – Benjamin
Tôi đã thêm mã mẫu cho kịch bản phổ biến nhất. Tôi sẽ không lo lắng về số lượng các lĩnh vực - DDD thực sự không phải về dữ liệu, nó là về các mối quan hệ và quản lý phức tạp. – kstaruch