Trong DDD, logic ứng dụng xác nhận, hay logic miền?


26

Giả sử rằng chúng ta đang lập mô hình một biểu mẫu bằng DDD; biểu mẫu có thể có một số quy tắc kinh doanh nhất định liên quan đến nó - có lẽ bạn sẽ cần chỉ định thu nhập nếu bạn không phải là sinh viên và bạn được yêu cầu liệt kê con nếu bạn cho biết bạn đã kết hôn. Và nếu bạn đã chỉ định một quốc gia, thì quốc gia đó phải có một quốc gia hợp lệ.

Liệu loại xác nhận này sống trong miền hoặc lớp ứng dụng? Một số vấn đề khác tôi đã xem xét:

  • Một số khung nhất định, chẳng hạn như Laravel, cung cấp các quy tắc xác thực có thể xác thực đầu vào trước khi yêu cầu đến bộ điều khiển. Nó có phá vỡ DDD nếu xác nhận được thực hiện ở mức đó không?

  • Đối với các trường hợp như xác định xem quốc gia có hợp lệ hay không, thông thường tôi sẽ chỉ truy vấn bảng cơ sở dữ liệu của tất cả các quốc gia trên thế giới. Tuy nhiên, trong DDD, điều này có thể (theo cách hiểu của tôi) sẽ được thực hiện trên lớp miền. Lớp miền có được phép truy cập DB hay tôi phải sử dụng tìm kiếm không phải SQL để xác định quốc gia hợp lệ?

  • Có cần thiết phải xác nhận đầu vào cả ở ứng dụng và lớp miền không?


6
Câu hỏi của bạn cho rằng luôn có một nơi chính xác để đặt mọi thứ. Không có.
Robert Harvey

1
Những gì @RobertHarvey nói. Xác nhận phải luôn luôn có trên mô hình, bất kể xác nhận của "ứng dụng" nào (không phải là phần mô hình của ứng dụng?). Bất kỳ xác nhận nào trong "ứng dụng" chỉ nên là sự lặp lại xác thực của mô hình - để tăng cường khả năng phản hồi của UI hoặc chỉ nên liên quan đến logic "ứng dụng" (như trong: "trên mẫu này bạn chỉ có thể nhập. .. ", nhưng tôi đã giả sử xác nhận thực thể). Không bao giờ tin tưởng lớp "ứng dụng" để xác thực tên miền, nó có thể không phải là khách hàng của bạn gửi thông tin ...
Marjan Venema

Câu trả lời:


29

Liệu loại xác nhận này sống trong miền hoặc lớp ứng dụng?

Ứng dụng. Thuật ngữ tìm kiếm ma thuật bạn muốn là lớp chống tham nhũng

Thông thường, tin nhắn mà ứng dụng của bạn nhận được sẽ là một chút hương vị của DTO. Lớp chống tham nhũng của bạn thường sẽ tạo các loại giá trị mà tên miền sẽ nhận ra. Lệnh thực tế được gửi đến mô hình miền sẽ được thể hiện dưới dạng các loại giá trị được xác thực.

Ví dụ: lệnh DepositMoney có thể sẽ bao gồm số tiền và loại tiền tệ. Đại diện DTO có thể sẽ biểu thị số tiền dưới dạng số nguyên và mã tiền tệ dưới dạng chuỗi. Lớp chống tham nhũng sẽ chuyển đổi DTO thành loại giá trị Tiền gửi, bao gồm Số tiền được xác thực (phải không âm) và Tiền tệ được xác thực (phải là một trong các mã được hỗ trợ trong miền).

Đã phân tích thành công lệnh thành các kiểu mà mô hình miền hiểu, lệnh được thực thi trong miền, điều này vẫn có thể từ chối lệnh với lý do nó sẽ vi phạm bất biến doanh nghiệp (tài khoản chưa tồn tại, tài khoản bị chặn, tài khoản cụ thể này không được phép sử dụng loại tiền đó? v.v.).

Nói cách khác, việc xác thực doanh nghiệp sẽ diễn ra trong mô hình miền, sau khi lớp chống tham nhũng xác thực các đầu vào.

Việc thực thi các quy tắc xác thực thường sẽ sống trong hàm tạo của loại giá trị hoặc trong phương thức nhà máy được sử dụng để xây dựng loại giá trị. Về cơ bản, bạn hạn chế việc xây dựng các đối tượng để chúng được đảm bảo là hợp lệ, cô lập logic ở một nơi và gọi nó ở ranh giới quá trình.


Tại sao ứng dụng là câu trả lời? Theo văn bản của bạn, xác nhận chính thức có thể được thực hiện cả trong miền hoặc trong ứng dụng và xác thực doanh nghiệp trong miền.
inf3rno

@ inf3rno vì các câu hỏi được hỏi cụ thể về việc xác thực một biểu mẫu, không liên quan đến tên miền
gian

1
Câu trả lời này không có ý nghĩa. Lớp chống tham nhũng của DDD là mã bổ sung mà bạn viết để dịch sang / từ một mô hình miền bên ngoài (của một hệ thống khác) và mô hình miền của ứng dụng dựa trên DDD của bạn. Nếu không có hệ thống bên ngoài như vậy, thì không có lớp Chống tham nhũng. Ngoài ra, xác thực các quy tắc kinh doanh thuộc về Mô hình miền (và lớp Miền), không phải lớp Ứng dụng. Đối với DTO, đây là thành phần kỹ thuật (trong lớp Ứng dụng) có thể tồn tại hoặc không tồn tại trong ứng dụng DDD. Chuyển đổi giữa các DTO và Thực thể / ValueObjects không liên quan gì đến các lớp Chống tham nhũng.
Rogério

5

Mô hình miền vấn đề của bạn bao gồm các quy tắc kinh doanh tên miền của bạn. Quy tắc kinh doanh là các ràng buộc về các yếu tố của mô hình. Điều đó có nghĩa là thang máy không di chuyển khi cửa mở, hàng hóa dễ hỏng không được nạp vào container không được làm lạnh và đơn đặt hàng bị hủy sẽ không được giao.

Điều đó không có nghĩa là khi tên miền của bạn tương tác với con người (thông qua màn hình, biểu mẫu, v.v.) thì không cần phải có xác nhận hoặc hỗ trợ. Chỉ cần nhận ra nó là tùy chọn.

Hãy xem xét rằng có hai loại quy tắc kinh doanh: - quy tắc thuộc tính ràng buộc các thuộc tính của đối tượng và quy tắc cộng tác ràng buộc việc thêm và loại bỏ sự hợp tác giữa các đối tượng.

Các quy tắc kinh doanh khác với các quy tắc logic, có liên quan đến ngôn ngữ lập trình của bạn và kiểm tra xem các giá trị đã được cung cấp và không null, v.v.

Lưu ý: không có khái niệm nào trong DDD về "mô hình hóa" biểu mẫu của bạn.


0

Nhà nước cụ thể sẽ làm cho thực thể mô hình không hợp lệ? Nếu có, thì mô hình phải ngăn thực thể đến trạng thái đó. Điều đó có nghĩa là mô hình phải biết cách xác nhận chính nó.

Nhưng có một vấn đề nhỏ: xác nhận mô hình thường xảy ra quá muộn. Thông thường, chúng tôi muốn thực hiện xác nhận sớm, vì vậy người dùng không phải chờ quá lâu. Đó là lý do tại sao xác nhận thường được đưa vào logic ứng dụng.

Đối với bối cảnh xác nhận: Không có vấn đề về việc thực thể có thể truy vấn dữ liệu bổ sung. Nhưng nó không quan tâm những dữ liệu đó đến từ đâu. Nó không quan tâm nếu nó đến từ SQL, File hoặc chỉ được mã hóa cứng. Đó là lý do tại sao các kho lưu trữ tồn tại. Miền xác định loại truy vấn nào cần và cho phép người khác chăm sóc việc thực hiện.


-2

Lớp miền phải chứa tất cả logic xác thực. Trình bày, các lớp chống tham nhũng hoặc các lớp phụ thuộc khác nên phản ánh điều đó.

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.