Tôi đã đọc Evans, Nilsson và McCarthy, trong số những người khác, và hiểu các khái niệm và lý do đằng sau thiết kế định hướng miền; tuy nhiên, tôi thấy rất khó để kết hợp tất cả chúng lại với nhau trong một ứng dụng thực tế. Việc thiếu các ví dụ hoàn chỉnh đã khiến tôi gãi đầu. Tôi đã tìm thấy rất nhiều khuôn khổ và ví dụ đơn giản nhưng không có gì cho đến nay mà thực sự chứng minh làm thế nào để xây dựng một ứng dụng kinh doanh thực tế sau một DDD.Kết nối các dấu chấm với DDD
Sử dụng hệ thống quản lý đơn đặt hàng điển hình làm ví dụ, lấy trường hợp hủy đơn đặt hàng. Trong thiết kế của tôi, tôi có thể thấy một OrderCancellationService với một phương thức CancelOrder chấp nhận thứ tự # và một lý do làm tham số. Sau đó nó có để thực hiện 'bước' sau:
- Xác minh rằng người dùng hiện có sự cho phép cần thiết để hủy bỏ Lệnh
- Lấy thực thể Order trình tự quy định # từ OrderRepository
- Xác minh rằng Lệnh có thể bị hủy bỏ (liệu dịch vụ có nên thẩm vấn tình trạng của Lệnh để đánh giá các quy tắc hay Lệnh có tài sản CanCancel đóng gói các quy tắc?)
- Cập nhật trạng thái Đơn hàng bằng cách gọi Order.Cancel (lý do)
- Tiếp tục cập nhật d theo thứ tự để lưu trữ dữ liệu
- Liên hệ với CreditCardService để trở lại bất kỳ khoản phí thẻ tín dụng đã được xử lý
- Thêm một mục kiểm toán cho các hoạt động
Tất nhiên, tất cả điều này nên xảy ra trong một giao dịch và không có hoạt động nào được phép xảy ra độc lập. Ý tôi là, tôi phải hoàn nguyên giao dịch thẻ tín dụng nếu tôi hủy đơn đặt hàng, tôi không thể hủy và không thực hiện bước này. Điều này, imo, cho thấy đóng gói tốt hơn nhưng tôi không muốn có một sự phụ thuộc vào CreditCardService trong đối tượng miền của tôi (Order), do đó, có vẻ như đây là trách nhiệm của dịch vụ miền.
Tôi đang tìm ai đó để hiển thị cho tôi các ví dụ mã về cách thức này có thể/nên được "lắp ráp". Quá trình suy nghĩ đằng sau mã sẽ hữu ích trong việc giúp tôi kết nối tất cả các dấu chấm cho bản thân mình. Cám ơn!
Tại sao tôi không muốn 'tra cứu', quản lý giao dịch và gọi để thay đổi liên tục trong dịch vụ? Có vẻ như sẽ đảm bảo việc sử dụng phù hợp mọi lúc. – SonOfPirate
Tra cứu - có thể. Quản lý giao dịch không thuộc về dịch vụ miền, nó thường được thực hiện ở tầng ứng dụng (người gọi của dịch vụ miền). 'Call to persist changes' được xử lý bởi ORM hoặc UnitOfWork vì chúng ta đang thay đổi các đối tượng hiện có mà không cần gọi rõ ràng trong trường hợp NHibernate. Ý tưởng là giữ mã miền là thuyết bất khả tri bền vững nhất có thể. – Dmitry
Vâng, tôi sẽ sử dụng một OrderRepository và UoW để giữ cho miền này trở nên bất khả tri nhất có thể, nhưng không có gì ngăn cản mã ứng dụng gọi dịch vụ hủy của bạn mà không có sự thay đổi đối với thực thể Đơn hàng. Là không thuyết phục, tôi đã không nghĩ rằng nó quan trọng cho đến bây giờ mà chúng tôi không sử dụng NHibernate, do đó, bất kỳ giả định dựa trên ORM đó là không hợp lệ. – SonOfPirate