Trong DDD, Dịch vụ Miền về cơ bản chỉ là Mẫu Mặt tiền và / hoặc Người hòa giải?


12

Trong Thiết kế hướng tên miền, Lớp miền có thể có một số dịch vụ (truyền thống). Ví dụ: đối với miền Người dùng, chúng tôi có thể có:

  • UserFactory, xây dựng các đối tượng Người dùng theo nhiều cách khác nhau
  • Kho lưu trữ người dùng, chịu trách nhiệm tương tác với các dịch vụ bền bỉ trong lớp cơ sở hạ tầng

Là một Dịch vụ người dùng trong Lớp Miền chỉ đơn giản là Người hòa giải và / hoặc Mặt tiền cho hai dịch vụ đó và Lớp Cơ sở hạ tầng, hoặc có nhiều hơn cho nó không?



Tôi đã đọc bài viết Gorodinski cấp độ rất nhiều, mặc dù chưa bao giờ thấy liên kết thứ hai. Đọc tuyệt vời, chắc chắn chạm vào một số điểm quan trọng!
e_i_pi

Câu trả lời:


9

Domain services được mô tả tốt nhất bởi những gì họ không phải là:

  • họ cũng không EntitiesphảiAggregate roots
  • họ không phải Value objects
  • mang kiến ​​thức miền không tự nhiên chỉ phù hợp với mộtEntity hoặc một Value object

Một ví dụ về a Domain serviceSaga/Process manager: nó phối hợp một quá trình chạy dài liên quan đến nhiều Aggregate roots, có thể từ khác nhau Bounded contexts.

Điều đó đang được nói, những gì là một Domain servicelàm thế nào nó được thực hiện là hai điều trực giao.

Là một Dịch vụ người dùng trong Lớp Miền chỉ đơn giản là Người hòa giải và / hoặc Mặt tiền cho hai dịch vụ đó và Lớp Cơ sở hạ tầng, hoặc có nhiều hơn cho nó không?

Một số dịch vụ miền như UserRepository(bao gồm một giao diện được xác định trong Domain layervà triển khai cụ thể trong Infrastructure layer) có thể được triển khai bằng cách sử dụng Facademẫu thiết kế. Các dịch vụ tên miền khác thì không.

Không có quy tắc cứng nào về cách thực hiện chúng, ngoài quy tắc quan trọng là Domain layerkhông được phụ thuộc vào các lớp khác (và RẮN ).


Cảm ơn bạn, tôi nghĩ rằng cuối cùng tôi đã hiểu Lớp Miền. Cùng với việc giữ các đối tượng dữ liệu (Tập hợp, Thực thể và Đối tượng Giá trị), nó cũng giữ các quy tắc kinh doanh - nhưng không thực hiện cụ thể các quy tắc đó. Dịch vụ miền xác định những gì bạn có thể làm đối với các đối tượng dữ liệu Miền, nhưng không có kiến ​​thức về cách các hoạt động đó hoạt động bên trong.
e_i_pi

1
Các quy tắc kinh doanh @e_i_pi chỉ được bảo vệ bởi các Tập hợp và các thực thể lồng nhau của chúng. Dịch vụ tên miền không liên quan đến điều này.
Constantin Galbenu

1
@e_i_pi trong đó hoạt động liên quan đến nhiều hơn một Uẩn. Ví dụ: được đưa ra danh sách BankAccounts (Uẩn) của một người (một uẩn khác), một dịch vụ tên miền sẽ tính tổng số dư của các tài khoản đó.
Constantin Galbenu

1
@e_i_pi: Tôi nghĩ bạn có một vài quan niệm sai lầm. Vì vậy, toàn bộ Lớp Miền là một mô hình phần mềm của miền của bạn. Bạn đã nói - "Cùng với việc giữ các đối tượng dữ liệu (Tập hợp, Thực thể và Đối tượng Giá trị)" - đây không phải là "đối tượng dữ liệu" theo nghĩa là chúng chỉ giữ dữ liệu; Chúng thực sự thực hiện các quy tắc miền, chúng xác định hành vi. Bây giờ, Dịch vụ miền , theo Sách DDD của E. Evans , là những khía cạnh của miền không phù hợp tự nhiên với một đối tượng (một thực thể hoặc một đối tượng giá trị).
Filip Milovanović

1
Thay vào đó, một Dịch vụ miền "được định nghĩa hoàn toàn theo những gì nó có thể làm cho khách hàng", được định nghĩa theo các yếu tố khác của mô hình miền (do đó, nó phối hợp các yếu tố đó bằng cách nào đó và thực thi các quy tắc miền chi phối sự phối hợp đó). Bản thân dịch vụ tên miền là không quốc tịch. Ngoài ra còn có khái niệm Dịch vụ ứng dụng , nằm trong lớp cấp cao hơn và về cơ bản triển khai các câu chuyện của người dùng hoặc các trường hợp sử dụng tương đương, bằng cách đóng vai trò là giao diện đối với lớp miền. Lưu ý rằng tỷ lệ của các đối tượng và dịch vụ sẽ thay đổi tùy thuộc vào miền được mô hình hóa.
Filip Milovanović

1

Tôi thấy các dịch vụ trong DDD là kết quả của Nghịch đảo phụ thuộc .

Nếu bạn sử dụng các phụ thuộc "đơn giản", thì mã miền của bạn sẽ gọi cơ sở dữ liệu để lưu hoặc truy vấn một thực thể hoặc nhà máy, tạo ra một thực thể, được gắn với cơ sở dữ liệu hoặc dịch vụ bên ngoài hoặc một loại mã cơ sở hạ tầng khác.

Nhưng đó không phải là cách mã miền nên được. Mã miền không nên phụ thuộc vào mã cơ sở hạ tầng. Vì sự phụ thuộc này làm cho việc kiểm tra khó khăn hơn và có thể, sử dụng lại. Đó là lý do tại sao bạn đảo ngược sự phụ thuộc đó. Bạn tạo mã cơ sở hạ tầng phụ thuộc vào mã miền. Và để làm điều đó, bạn cần phải giới thiệu một sự trừu tượng. Một sự trừu tượng xác định hành vi nào mà mã miền dự kiến ​​sẽ được cơ sở hạ tầng triển khai.

Và các dịch vụ trong DDD là sự trừu tượng đó. Trong hầu hết các trường hợp, đối với mã miền, các dịch vụ đó phải là giao diện đơn giản. Và việc thực hiện phải nằm trong mã cơ sở hạ tầng, có sự phụ thuộc vào các giao diện đó.


Cảm ơn câu trả lời của bạn, cả hai câu trả lời cùng nhau đã cho tôi "aha!" chốc lát. Tôi nghĩ rằng không có câu trả lời của bạn, tôi sẽ không hoàn toàn nắm bắt được khái niệm này, nhưng tôi thích câu trả lời của Constantine như một chỉ báo cho những độc giả tương lai.
e_i_pi
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.