Tôi đang phát triển API RESTful. Đây là API đầu tiên của tôi, nhưng cũng là dự án mã hóa thực sự lớn đầu tiên của tôi. Như vậy, tôi vẫn đang học hỏi rất nhiều về kiến trúc, vvAPI RESTful: Tôi nên viết mã cho luồng công việc của mình ở đâu?
Hiện nay, tôi đã thiết lập api của tôi trong các lớp sau:
- HTTP lớp
- Resource lớp
- Domain Model/Kinh doanh logic lớp
- Data Access/Repository lớp
- dai dẳng lưu trữ/DB lớp
Vấn đề tôi đã gặp phải vào lúc này là nơi tôi cần phải đặt đối tượng/người quản lý luồng công việc? Theo quy trình công việc, tôi có nghĩa là mã đánh giá bước tiếp theo là yêu cầu của người dùng cuối. Ví dụ: quy trình làm việc thương mại điện tử. Người dùng thêm mục vào giỏ, sau đó kiểm tra, sau đó điền vào các chi tiết cá nhân, sau đó trả tiền. Quy trình làm việc sẽ chịu trách nhiệm quyết định các bước tiếp theo, nhưng cũng không cho phép các bước nào. Ví dụ: người dùng không thể gây ra lỗi trong API bằng cách cố gắng thanh toán trước khi họ nhập chi tiết cá nhân (có thể họ gọi lại URI để thanh toán và cố gắng bỏ qua một bước). Quy trình làm việc sẽ kiểm tra để thấy rằng tất cả các bước trước đã được hoàn thành, nếu không, sẽ không cho phép thanh toán.
Hiện tại, luồng công việc của tôi nằm trong Lớp tài nguyên. Tôi đang sử dụng các liên kết hypermedia để trình bày quy trình làm việc cho người dùng, ví dụ: cung cấp liên kết 'bước tiếp theo'. Vấn đề tôi có với điều này là lớp tài nguyên là lớp cấp cao nhất và phù hợp hơn với bản trình bày. Tôi cảm thấy cần phải biết quá nhiều về mô hình miền cơ bản để đánh giá hiệu quả luồng công việc tức là cần biết rằng phải kiểm tra thực thể personal_detail
trước khi cho phép thanh toán.
Điều này giờ đây khiến tôi nghĩ rằng luồng công việc thuộc về mô hình miền. Điều này có ý nghĩa hơn rất nhiều, vì luồng công việc thực sự là một phần của logic nghiệp vụ và do đó tôi nghĩ là tốt nhất được đặt trong lớp miền. Sau khi tất cả, thay thế lớp tài nguyên với một cái gì đó khác, và bạn vẫn sẽ cần các quy trình công việc cơ bản.
Nhưng bây giờ vấn đề là luồng công việc cần kiến thức về một số đối tượng miền để hoàn thành logic của họ. Nó bây giờ cảm thấy đúng rằng nó có thể đi trong lớp riêng của mình? Giữa tài nguyên và lớp miền?
- HTTP lớp
- Resource lớp
- Workflow lớp
- Domain Model/Business Logic lớp
- Data Access/Repository lớp
- dai dẳng lưu trữ/DB lớp
Im chỉ tự hỏi nếu bất cứ ai có bất kỳ quan điểm hoặc suy nghĩ khác xung quanh điều này? Như tôi đã nói, tôi không có kinh nghiệm ứng dụng trong quá khứ để biết nơi công việc nên được đặt. Im thực sự chỉ cần học tập này lần đầu tiên vì vậy muốn chắc chắn rằng tôi đang đi về nó đúng cách.
Liên kết tới các bài viết hoặc blog bao gồm điều này sẽ được đánh giá cao. Tình yêu đọc lên trên các triển khai khác nhau.
EDIT
Để làm rõ, tôi phát hành mà HATEOAS cho phép khách hàng để điều hướng thông qua các 'công việc', nhưng phải có cái gì đó trong API của tôi mà biết những gì liên kết để hiển thị tức là nó thực sự là xác định công việc đó là được phép. Nó trình bày các liên kết luồng công việc có liên quan trong tài nguyên, nhưng bổ sung nó xác nhận các yêu cầu được đồng bộ với luồng công việc. Trong khi tôi đồng ý rằng một khách hàng có thể sẽ chỉ theo các liên kết được cung cấp trong tài nguyên, sự nguy hiểm (và vẻ đẹp) của phần còn lại, đó là URI của nó được điều khiển, vì vậy không có gì ngăn cản một khách hàng tinh nghịch cố gắng 'bỏ qua' các bước trong luồng công việc thực hiện dự đoán có giáo dục tại URI. API cần phát hiện ra điều này và trả về phản hồi 302.
Tôi không đồng ý với những gì bạn đã nói. REST API sử dụng HATEOAS để cho phép người dùng xác định 'luồng công việc' thông qua ứng dụng. Nhưng điều bạn đang nói là chúng ta nên cho phép người dùng (hoặc ứng dụng khách) định nghĩa logic và làm bất cứ điều gì họ muốn !! Điều này rõ ràng là sai. Vì vậy, những gì tôi đang nói về là đảm bảo rằng 'quy trình làm việc' mà khách hàng đang theo dõi được cho phép. Một số phần của API phải chịu trách nhiệm làm việc ra những liên kết nào được phép hiển thị với tài nguyên (quy trình làm việc) và cũng xác nhận rằng các yêu cầu không nằm ngoài luồng công việc (ví dụ trả về 302) xem cập nhật ở trên –
Vì máy chủ cung cấp javascript cho khách hàng mà khách hàng sử dụng để xác định có hay không hiển thị liên kết, máy chủ về bản chất mở rộng logic của nó lên máy khách và do đó vẫn xác định quy trình làm việc. Không có gì để ngăn bạn tiêm một lớp nghiệp vụ trong kiến trúc của bạn giữa giao diện người dùng và các dịch vụ REST, nhưng khi bạn làm như vậy, tùy thuộc vào cách bạn triển khai nó, giao diện người dùng của bạn có thể không còn giao tiếp RESTfully nữa. –
Và lớp kinh doanh này sẽ ở đâu? –