Tôi đang cố gắng thiết kế một ứng dụng có miền kinh doanh phức tạp và yêu cầu hỗ trợ API REST (không hoàn toàn là REST, nhưng hướng đến tài nguyên). Tôi gặp một số rắc rối khi nghĩ ra cách phơi bày mô hình miền theo cách định hướng tài nguyên.
Trong DDD, khách hàng của mô hình miền cần trải qua lớp 'Dịch vụ ứng dụng' theo thủ tục để truy cập bất kỳ chức năng kinh doanh nào, được thực hiện bởi Thực thể và Dịch vụ miền. Ví dụ: có một dịch vụ ứng dụng với hai phương thức để cập nhật thực thể Người dùng:
userService.ChangeName(name);
userService.ChangeEmail(email);
API của Dịch vụ ứng dụng này hiển thị các lệnh (động từ, thủ tục), không phải trạng thái.
Nhưng nếu chúng ta cũng cần cung cấp API RESTful cho cùng một ứng dụng, thì có một mô hình tài nguyên Người dùng, trông giống như sau:
{
name:"name",
email:"email@mail.com"
}
API hướng tài nguyên hiển thị trạng thái , không phải lệnh . Điều này đặt ra những mối quan tâm sau:
mỗi hoạt động cập nhật đối với API REST có thể ánh xạ tới một hoặc nhiều lệnh gọi thủ tục Dịch vụ ứng dụng, tùy thuộc vào thuộc tính nào đang được cập nhật trên mô hình tài nguyên
mỗi hoạt động cập nhật trông giống như ứng dụng khách API REST, nhưng nó không được thực hiện như thế. Mỗi cuộc gọi Dịch vụ Ứng dụng được thiết kế như một giao dịch riêng. Cập nhật một trường trên mô hình tài nguyên có thể thay đổi quy tắc xác thực cho các trường khác. Vì vậy, chúng ta cần xác thực tất cả các trường mô hình tài nguyên cùng nhau để đảm bảo rằng tất cả các lệnh gọi Dịch vụ ứng dụng tiềm năng là hợp lệ trước khi chúng ta bắt đầu thực hiện chúng. Xác thực một tập hợp các lệnh cùng một lúc sẽ ít tầm thường hơn khi thực hiện từng lệnh một. Làm thế nào để chúng ta làm điều đó trên một máy khách thậm chí không biết các lệnh riêng lẻ tồn tại?
gọi các phương thức Dịch vụ Ứng dụng theo các thứ tự khác nhau có thể có hiệu ứng khác nhau, trong khi API REST làm cho nó trông giống như không có sự khác biệt (trong một tài nguyên)
Tôi có thể đưa ra nhiều vấn đề tương tự, nhưng về cơ bản tất cả chúng đều do cùng một nguyên nhân. Sau mỗi cuộc gọi đến Dịch vụ Ứng dụng, trạng thái của hệ thống sẽ thay đổi. Quy tắc thay đổi hợp lệ là gì, tập hợp các hành động mà một thực thể có thể thực hiện thay đổi tiếp theo. API hướng tài nguyên cố gắng làm cho tất cả trông giống như một hoạt động nguyên tử. Nhưng sự phức tạp của việc vượt qua khoảng cách này phải đi đâu đó, và nó có vẻ rất lớn.
Ngoài ra, nếu UI có định hướng lệnh nhiều hơn, thường là như vậy, thì chúng ta sẽ phải ánh xạ giữa các lệnh và tài nguyên ở phía máy khách và sau đó quay lại phía API.
Câu hỏi:
- Tất cả sự phức tạp này có nên được xử lý bởi lớp ánh xạ REST-to-AppService (dày) không?
- Hay tôi đang thiếu một cái gì đó trong sự hiểu biết của tôi về DDD / REST?
- Có thể REST đơn giản là không thực tế để hiển thị chức năng của các mô hình miền trên một mức độ phức tạp (khá thấp) nhất định?