7

Tôi mới tham gia DDD, nhưng tôi đang cố gắng kết hợp các khái niệm DDD vào dự án hiện tại của mình.CRUD trong dịch vụ ứng dụng DDD?

Đối với nhiều thực thể trong miền của tôi, khách hàng cần thực hiện tất cả các hoạt động CRUD tiêu chuẩn độc lập với bất kỳ luồng công việc cụ thể nào. Tôi đang tìm bản thân mình với một số dịch vụ cấp ứng dụng với các tên như UserService hoặc LocationService làm ít hơn hành động như mặt tiền cho các kho tương ứng.

Các dịch vụ ứng dụng này có phải là mặt tiền của kho chứa ứng dụng "đúng" của mẫu dịch vụ ứng dụng không? Hoặc các phương pháp chỉ có CRUD sẽ không sử dụng các dịch vụ ứng dụng? Nếu vậy, nên có một mặt tiền kho lưu trữ ở tầng giao diện?

Trả lời

6

Điều này tất nhiên phụ thuộc vào ứng dụng và cũng có thể là một vấn đề của hương vị, nơi một số lựa chọn cho một cách tiếp cận trực tiếp hơn và tiếp xúc với kho lưu trữ trực tiếp cho khách hàng. Một lợi ích của phương pháp này là sự đơn giản. Bạn không đi qua các lớp để theo dõi việc thực thi mã. Mặt khác, vai trò của dịch vụ ứng dụng là một mặt tiền hoặc API cho lớp miền.

Nói cách khác, các dịch vụ ứng dụng đóng gói lớp miền và phối hợp thực thi logic miền. Theo mã thông báo này, kho lưu trữ cũng có thể được đóng gói bởi dịch vụ ứng dụng. Lợi ích trong trường hợp này có thể là tính nhất quán trong đó tất cả các máy khách của lớp miền tương tác với nó thông qua các dịch vụ ứng dụng, cho dù chúng đang phát lệnh hoặc lấy dữ liệu.

Giải pháp tốt nhất tùy thuộc vào ứng dụng của bạn. Nếu tất cả các chức năng cần thiết là CRUD hoặc chủ yếu là CRUD, không cần dịch vụ ứng dụng, (hoặc DDD chính thức cho vấn đề đó) vì trong trường hợp này tất cả các dịch vụ đều là đại diện cho kho và do đó làm tăng thêm sự phức tạp không cần thiết. Tuy nhiên, dịch vụ ứng dụng cũng có thể là một giao diện thuận tiện để quản lý các giao dịch và các đơn vị công việc mà kho lưu trữ không cần phải xử lý.

Cách khác là ủy quyền trách nhiệm này cho cơ sở hạ tầng của môi trường lưu trữ, chẳng hạn như bộ lọc hành động trong ứng dụng ASP.NET MVC.


+3

Vui lòng sử dụng các đoạn văn, giúp văn bản dễ đọc hơn rất nhiều. – jgauffin

+0

Xin lỗi, sẽ làm! – eulerfx

+0

trong trường hợp sử dụng CRUDy và khách hàng đang gọi kho trực tiếp, nên repositoryImpl không được xử lý giao dịch? – redzedi

1

Phương pháp của bạn trong dịch vụ ứng dụng phải có tên đại diện cho trường hợp sử dụng của bạn. Người ta thường nói trong DDD rằng bạn nên tránh CRUD, nhưng theo kinh nghiệm của tôi, các chủ sở hữu sản phẩm/chuyên gia miền thường nói về 'tạo' hoặc 'thêm' một thực thể và 'cập nhật', 'chỉnh sửa' hoặc 'sửa đổi' và thực thể. Nếu đó là những trường hợp sử dụng bạn đã được giao nhiệm vụ triển khai thì chắc chắn họ sẽ ở trong lớp ứng dụng của bạn.

Nếu chủ sở hữu sản phẩm đang nói về phản ánh CRUD thì nó nên ở đó, nhưng nếu họ đang nói về những điều không phản ánh CRUD thì bạn nên tránh nó.

3

Nếu miền của bạn yêu cầu các trường hợp sử dụng kiểu CRUD, thì chúng đúng.

Theo ý kiến ​​của tôi, việc hiển thị kho trực tiếp sẽ sai, vì trách nhiệm của các dịch vụ ứng dụng bao gồm nhiều hơn "chỉ" trường hợp sử dụng chức năng; đó là kiểm soát giao dịch, bảo mật và xác thực đầu vào cơ bản.