Tôi nghĩ bạn cần tách hai loại xác nhận trong trường hợp này; xác nhận tên miền và xác nhận ứng dụng .
Xác thực ứng dụng là những gì bạn có khi xác minh rằng 'văn bản' thuộc tính lệnh có từ 20 đến 200 ký tự; vì vậy, bạn xác nhận điều này với GUI và với trình xác thực mô hình khung nhìn cũng thực thi tại máy chủ sau khi POST. Điều tương tự cũng xảy ra với e-mail (btw, tôi hy vọng bạn nhận ra rằng một e-mail như `32.d +" Hello World .42 "@ mindomän.local" là hợp lệ theo RFC).
Sau đó, bạn có một xác nhận khác; kiểm tra xem bài viết đó có tồn tại không - bạn phải tự hỏi mình câu hỏi tại sao bài viết không nên tồn tại nếu thực sự có một lệnh được gửi từ GUI về việc đính kèm một bình luận cho nó. GUI của bạn cuối cùng có nhất quán và bạn có một gốc tổng hợp, bài viết, có thể bị xóa khỏi kho lưu trữ dữ liệu không? Trong trường hợp đó, bạn chỉ cần di chuyển lệnh đến hàng đợi lỗi vì trình xử lý lệnh không tải được tổng hợp gốc.
Trong trường hợp trên, bạn sẽ có cơ sở hạ tầng xử lý các tin nhắn độc hại - ví dụ, họ sẽ thử lại tin nhắn 1-5 lần và sau đó di chuyển nó đến hàng đợi phân chia nơi bạn có thể kiểm tra thủ công bộ sưu tập tin nhắn và gửi lại những tin nhắn có liên quan. Đó là một điều tốt để theo dõi.
Vì vậy, bây giờ chúng tôi đã thảo luận:
Còn các lệnh không đồng bộ với miền thì sao? Có lẽ bạn có một quy tắc trong logic tên miền của mình khi nói rằng sau 5 bình luận cho một bài viết, chỉ cho phép bình luận dưới 400 ký tự, nhưng một anh chàng đã quá muộn với bình luận thứ 5 và trở thành người thứ 6 - GUI không nắm bắt được vì nó không phù hợp với tên miền tại thời điểm anh ta gửi lệnh của mình - trong trường hợp này bạn có 'lỗi xác thực' là một phần của logic miền của bạn và bạn sẽ trả về sự kiện lỗi tương ứng.
Sự kiện này có thể ở dạng tin nhắn lên một nhà môi giới tin nhắn hoặc người điều phối tùy chỉnh của bạn. Máy chủ web, nếu ứng dụng là nguyên khối, có thể lắng nghe đồng bộ cả sự kiện thành công và sự kiện thất bại được đề cập và hiển thị chế độ xem / bộ phận phù hợp.
Thường thì bạn có sự kiện tùy chỉnh có nghĩa là thất bại đối với nhiều loại lệnh và đó là sự kiện mà bạn đăng ký theo quan điểm của máy chủ web.
Trong hệ thống mà chúng tôi đang làm việc, chúng tôi đang thực hiện phản hồi yêu cầu với các lệnh / sự kiện qua một bus môi giới MassTransit + RabbitMQ và chúng tôi có một sự kiện trong miền cụ thể này (mô hình hóa một quy trình công việc) được đặt tên InvalidStateTransitionError
. Hầu hết các lệnh cố gắng di chuyển dọc theo một cạnh trong biểu đồ trạng thái có thể gây ra sự kiện này. Trong trường hợp của chúng tôi, chúng tôi sẽ lập mô hình GUI theo mô hình nhất quán cuối cùng và vì vậy chúng tôi gửi người dùng đến trang 'được chấp nhận lệnh' và sau đó cho phép các chế độ xem của máy chủ web cập nhật thụ động thông qua đăng ký sự kiện. Cần phải đề cập rằng chúng tôi cũng đang thực hiện tìm nguồn cung ứng sự kiện trong các gốc tổng hợp (và cũng sẽ làm cho sagas).
Vì vậy, bạn thấy, rất nhiều xác nhận mà bạn đang nói đến thực sự là xác nhận kiểu ứng dụng, không phải logic miền thực tế. Không có vấn đề gì khi có một mô hình miền đơn giản nếu tên miền của bạn đơn giản nhưng bạn đang thực hiện DDD. Tuy nhiên, khi bạn tiếp tục mô hình hóa tên miền của mình, bạn sẽ phát hiện ra rằng tên miền có thể không đơn giản như lần đầu tiên xuất hiện. Trong nhiều trường hợp, gốc / thực thể tổng hợp có thể chỉ chấp nhận một lời gọi phương thức gây ra bởi một lệnh và thay đổi một số trạng thái của nó mà không thực hiện bất kỳ xác nhận nào - đặc biệt là nếu bạn tin tưởng các lệnh của mình như bạn làm nếu bạn xác thực chúng trong máy chủ web bạn kiểm soát.
Tôi có thể giới thiệu và xem hai bài thuyết trình về DDD từ Hội nghị nhà phát triển Na Uy 2011 và cả bài thuyết trình của Greg tại Öredev 2010 .
Chúc mừng, Henke