Cách chọn giữa sử dụng Sự kiện Miền hoặc để lớp ứng dụng phối hợp mọi thứ


27

Tôi đang đặt những bước đầu tiên của mình vào thiết kế hướng tên miền, mua tất cả các cuốn sách màu xanh và tôi thấy mình có ba cách để thực hiện một giải pháp nhất định. Đối với hồ sơ: Tôi không sử dụng CQRS hoặc Tìm nguồn sự kiện.

Giả sử một yêu cầu người dùng đến lớp dịch vụ ứng dụng. Logic nghiệp vụ cho yêu cầu đó là (vì bất kỳ lý do gì) được phân tách thành một phương thức trên một thực thể và một phương thức trên một dịch vụ miền. Làm thế nào tôi nên đi về việc gọi những phương pháp đó?

Các tùy chọn tôi đã thu thập được cho đến nay là:

  • Hãy để dịch vụ ứng dụng gọi cả hai phương thức
  • Sử dụng phương thức tiêm / gửi kép để tiêm dịch vụ miền vào thực thể, để thực thể thực hiện điều đó và sau đó cho phép nó gọi phương thức của dịch vụ miền (hoặc ngược lại, để dịch vụ miền gọi phương thức trên thực thể)
  • Tăng một sự kiện miền trong phương thức thực thể, một trình xử lý gọi dịch vụ miền. (Loại sự kiện tên miền mà tôi đang nói đến là: http://www.udidahan.com/2009/06/14/domain-events-salvation/ )

Tôi nghĩ rằng tất cả đều khả thi, nhưng tôi không thể chọn giữa chúng. Tôi đã suy nghĩ về điều này trong một thời gian dài và tôi đã đến một điểm mà tôi không còn thấy sự khác biệt về ngữ nghĩa giữa ba người. Bạn có biết một số hướng dẫn khi sử dụng những gì?


1
cảm ơn vì liên kết thú vị đến thông tin về các sự kiện trong miền.
JW01

Cả hai phương pháp phải được gọi theo một thứ tự cụ thể?
SpaceTrucker

@SpaceTrucker Trong trường hợp cụ thể của tôi, nó không thực sự quan trọng. Nhưng trong mỗi tùy chọn tôi đã đề cập đến bản thân mình, có thể ra lệnh thực hiện các phương thức nếu muốn.
dvdvorle

Câu trả lời:


19

Hãy để dịch vụ ứng dụng gọi cả hai phương thức

Dịch vụ ứng dụng thường là nơi khởi đầu tuyệt vời cho việc này, tuy nhiên bạn nên luôn cố gắng thay đổi hành vi càng gần với thực thể càng tốt. Dịch vụ ứng dụng đóng vai trò điều phối và nó thiết lập giai đoạn thực hiện hành vi tên miền và do đó nó cung cấp tất cả các phụ thuộc cần thiết. Tuy nhiên, khi có thể, nên ủy thác hành vi cho mô hình miền.

Sử dụng phương thức tiêm / gửi kép để tiêm dịch vụ miền vào thực thể, để thực thể thực hiện điều đó và sau đó cho phép nó gọi phương thức của dịch vụ miền (hoặc ngược lại, để dịch vụ miền gọi phương thức trên thực thể)

Đây là một cách tiếp cận tốt hơn vì nhiều hành vi được ủy quyền cho dịch vụ thực thể hoặc tên miền. Cách tách rời nhất để thực hiện điều này là để một thực thể thể hiện sự phụ thuộc vào một dịch vụ là một tham số của phương thức cung cấp hành vi trong tay.

Tăng một sự kiện miền trong phương thức thực thể, một trình xử lý gọi dịch vụ miền.

Mẫu sự kiện miền, như được giải thích bởi Udi và cũng là chính Evans, khá linh hoạt và có thể được áp dụng trong nhiều tình huống khác nhau. Tuy nhiên, có một vài biến chứng đi kèm với nó. Trước tiên, bạn phải đảm bảo rằng bạn có phạm vi phù hợp trong nhà xuất bản sự kiện tên miền. Hầu hết thời gian, trình xử lý sự kiện tên miền của bạn sẽ có các phụ thuộc và nếu bạn đang sử dụng bộ chứa IoC, bạn phải đảm bảo rằng một trường hợp thích hợp được tiêm. Ví dụ: trong một ứng dụng web,[ThreadStatic]thuộc tính là vấn đề cho phạm vi. Một sự phức tạp khác là ranh giới phiên mã. Bạn phải cân nhắc các giao dịch, bởi vì nếu một thực thể phát sinh một sự kiện miền, nhưng một cam kết tiếp theo với cơ sở dữ liệu không thành công, tất cả các trình xử lý sự kiện miền sẽ cần một cách để quay lại, nếu không bạn sẽ gây ra một sự kiện không hợp lệ. Tuy nhiên, nếu bạn có các cơ sở này, thì các sự kiện miền là một mô hình tuyệt vời để đóng gói logic miền trong chính các thực thể.

Sự khác biệt giữa cách tiếp cận 2 và 3 phụ thuộc vào trường hợp sử dụng. Một sự kiện miền áp dụng khi bạn muốn gọi các hành vi bổ sung để đáp ứng với một sự kiện đang ở thì quá khứ . Đây là một hạn chế quan trọng, vì trình xử lý sự kiện miền không thể ảnh hưởng đến hành vi của thực thể. Mặt khác, với cách tiếp cận 2, dịch vụ được tiêm có khả năng ảnh hưởng đến hành vi vì nó được tuyên bố là phụ thuộc cho hành vi cụ thể đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.