Kết hợp giữa các lớp trong DDD


8

Đọc tài liệu của DDD tôi đã đưa ra các lớp sau:

  • Application Thế giới bên ngoài (Bộ điều khiển, Crons, v.v.)
  • Application Services(hoặc UseCase) - nơi phối hợp nhiều Dịch vụ miền hoặc Dịch vụ cơ sở hạ tầng. Họ được gọi từ Outside World. Họ biết những gì phải được thực hiện
  • Domain Services - trong đó có cách mọi thứ được thực hiện (dựa trên giao diện kho lưu trữ)

Câu hỏi : Có cách thực hành tốt nhất nào để giao tiếp giữa các lớp không?

Những gì tôi biết: - Application servicesnên trả lại "dữ liệu mong muốn" và một số "thành công" của giao dịch (cảnh báo, lỗi, thông tin) - Dữ liệu mà một Application Servicekhoản hoàn trả, nên được thu thập từ Domain Servicesvà / hoặc tổng hợp Infrastructure Services.

Controller <-> Application Service <-> Domain Service          
                                   <-> Infrastructure Service

Đây là một số suy nghĩ mơ hồ của tôi:

  • Tất cả các phương thức trên Application Servicecó một DTO cụ thể có chứa "yêu cầu" làm tham số không? Giống như AddItemToCardCommandDto(đóng gói tất cả các dữ liệu cần thiết). Làm thế nào về một chung chung ResultObjectchỉ có một vài phương thức như getResulthasErrorrshoặc getMessages?

  • Làm thế nào nên trả lại DomainServicedữ liệu và lỗi? Họ có nên trả lại lỗi bằng ngoại lệ? Điều đó có vẻ kỳ lạ bởi vì đối với tôi, Xác thực doanh nghiệp nên được gọi DomainServicesvì chúng là một phần của quy tắc kinh doanh.


1
DDD không phải là một kỹ thuật lập trình. Có lẽ bạn đang đề cập đến Kiến trúc nhiều lớp?
Robert Harvey

DDD là "cách tiếp cận phát triển phần mềm" nhiều hơn. Từ những gì tôi hiểu, tôi đã đưa ra một số lớp. Bạn có thể nói chi tiết hơn về bình luận của bạn?
dùng237329

Kiến trúc nhiều lớp đi kèm với tập hợp "thực tiễn tốt nhất" của riêng nó. Bạn đã nghiên cứu những thực hành đó chưa? DDD không có bất cứ điều gì để nói về cách các lớp phần mềm của bạn giao tiếp, ngoài việc có thể thiết lập các lớp bạn sẽ sử dụng.
Robert Harvey

OK, bạn có thể chia sẻ một số trong những thực tiễn tốt nhất áp dụng cho câu hỏi của tôi không? Tôi chưa nghiên cứu cụ thể về chủ đề này
user237329

3
Có lẽ bạn nên .... chính xác câu hỏi của bạn gì? Bạn có thể nói nó theo cách không phải là một danh sách lớn các thứ hoặc yêu cầu một chương sách để trả lời?
Robert Harvey

Câu trả lời:


1

Tôi có thể nói rằng các DTO sẽ làm loãng thiết kế của Model. Chúng ta có thể thoát khỏi việc không sử dụng DTO bằng cách tái cấu trúc Mô hình và thiết kế API để sử dụng các đối tượng mô hình được tái cấu trúc.

Câu trả lời cho truy vấn 1: Dịch vụ ứng dụng có thể có các phương thức có chữ ký

void addItemToCard(Item item, Card card);

Các phương thức có thể có kiểu trả về hay không, dựa trên loại hoạt động mà chúng tôi đang tìm cách thực hiện và dữ liệu chúng tôi muốn chuyển qua các lớp. Bạn cần đảm bảo rằng mỗi lớp có một giao diện được chỉ định và các lớp khác nhau nói với nhau thông qua giao diện đó cho tất cả các thành phần trong ứng dụng.

Ví dụ:

List<Items> getItemsOnCard(String cardID);
//returns list of items or empty list if no item can be found.

List<Offers> getOffersApplicableOnCardForItem()
//should return list of Offers or empty list if no item can be found. Should not return a null if no items can be found

Đảm bảo rằng tất cả các phương thức tuân thủ cùng một hành vi là quan trọng hơn trong việc giữ nguyên giao diện.

Trả lời câu hỏi 2:

Tôi nghĩ DDD khuyên bạn nên có 3 lớp nếu tôi nhớ đúng. Có thông tin tên miền trong lớp ứng dụng sẽ giúp và biểu thị rằng ứng dụng của bạn bị ràng buộc với miền và có bối cảnh bị ràng buộc. Bạn có thể thêm các lớp bổ sung nếu bạn cảm thấy 3 không đủ. Các ngoại lệ có thể được sử dụng để xếp tầng thông tin trên các lớp. Dữ liệu có thể được chứa bên trong giữ chỗ của các ngoại lệ tùy chỉnh cho doanh nghiệp.

Tôi hy vọng điều này trả lời một số câu hỏi bạn có.

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.