6

Tôi có câu hỏi liên quan đến việc kiểm tra tính duy nhất trong DDD. Tôi biết đã có một số câu hỏi về điều này trên stackoverflow, nhưng họ không thực sự trả lời nghi ngờ của tôixác thực duy nhất trong DDD

Có thể cho một tổng thể để giữ tài liệu tham khảo của kho để kiểm tra tính độc đáo khi cập nhật/chèn vào cơ sở dữ liệu? Hoặc đây là nhiệm vụ được thực hiện bởi dịch vụ ứng dụng thay vì mô hình miền?

Hãy nói rằng tôi muốn kiểm tra xem tên người dùng của mô hình tài khoản là duy nhất khi người dùng đăng ký Có một số phương pháp mà tôi có thể nghĩ đến:

  • tài UserRepository mô hình tham chiếu, thực hiện kiểm tra tính độc đáo trong Validate()
  • Tạo dịch vụ miền để kiểm tra tính độc đáo, sử dụng UserRepository (điều này có vẻ hơi lạ đối với tôi vì tôi nghĩ dịch vụ tên miền thông thường chỉ được sử dụng trong trường hợp khoảng logic đến nhiều mô hình miền)
  • Tạo đối tượng đặc tả trong lớp miền, có tham chiếu đến Sử dụng rRepository để đóng gói quy tắc kiểm tra duy nhất và lớp dịch vụ ứng dụng sử dụng quy tắc này để thực hiện việc kiểm tra trước khi cập nhật/chèn

Và nếu tôi sử dụng tiêm phụ thuộc, tôi vẫn thắc mắc về cách đưa UserRepository vào User trong cách tiếp cận 1, hoặc dịch vụ miền trong phương pháp 2, hoặc dịch vụ ứng dụng trong phương pháp 3, bởi vì trong mọi trường hợp, đối tượng User/domain service/specification, tôi cần phải tạo đối tượng theo cách thủ công, vì vậy tùy chọn duy nhất tôi đang sử dụng định vị dịch vụ trong IoC để có được ví dụ. Nhưng dịch vụ định vị là một mô hình chống vì vậy tôi muốn tránh nó

Bất kỳ mẫu mã sẽ được nhiều đánh giá cao

+2

Tôi sẽ nói bạn nên triển khai điều này trong lớp dịch vụ. Để cụ thể hơn, hãy xác định một lớp trình xác nhận hợp lệ cho một loại logic nghiệp vụ cụ thể (lệnh của bạn) và xử lý xác thực trong một trình trang trí mà bạn quấn quanh lớp dịch vụ. – Steven

+0

Điều này có hữu ích không? http://stackoverflow.com/a/11958251/625332 – Dmitry

+0

@Steven vì vậy tôi nên tạo UserValidator để thực hiện việc kiểm tra Người dùng trong lớp dịch vụ? Nó được coi là rò rỉ quy tắc kinh doanh (tính duy nhất của tên người dùng) bên ngoài lớp miền? –

Trả lời

4

Tôi nghĩ rằng việc kiểm tra tính độc đáo rơi vào trách nhiệm Repository. Kho lưu trữ biết về tất cả các tập hợp bởi vì nó giả sử để mô phỏng bộ sưu tập tên miền, vì vậy nó là tự nhiên để yêu cầu Repository cho tính duy nhất (như bạn mong đợi từ HashMap ví dụ).

// repository 
interface Users { 
    // implementation executes SQL COUNT in case of relation DB 
    bool IsNameUnique(String name); 

    // implementation will call IsNameUnique and throw if it fails 
    void Add(User user); 
} 

Đó là một trừu tượng bị rò rỉ theo nghĩa bởi vì trong môi trường nhiều người, cần phải thực thi ở phía lưu trữ dữ liệu (ví dụ: Ràng buộc UNIQUE SQL hoặc khóa).

IsNameUnique có lẽ không nên được gọi từ Tổng hợp người dùng, tôi sẽ chuyển cuộc gọi này vào Ứng dụng hoặc Dịch vụ miền, tùy thuộc vào phần còn lại của ứng dụng của bạn được cấu trúc như thế nào.

Xem Uniqueness validation in CQRS Architecture để biết cách tiếp cận thay thế.

+0

vì vậy bạn đang đề xuất làm theo cách tiếp cận 2 ở trên, để tạo một dịch vụ miền để gọi kho lưu trữ để kiểm tra tính duy nhất? Có cách nào phổ biến trong DDD để tạo ra một dịch vụ xác nhận trong lớp miền như vậy? Tôi mới đến DDD vì vậy không chắc chắn –

+0

Việc sử dụng kho lưu trữ này từ Tên miền hay từ dịch vụ Ứng dụng phụ thuộc vào các trường hợp sử dụng của bạn, hoặc là miễn là bạn không sử dụng phương thức này từ tổng hợp. – Dmitry

+0

cảm ơn, cuối cùng tôi quyết định đi cho phương pháp này: http: // lostechies.com/jimmybogard/2007/10/24/entity-validation-with-visitors-và-extension-methods/ –