Tôi đã có một cuộc thảo luận sôi nổi ngày hôm nay về ứng dụng MVC của chúng tôi. Chúng tôi có một trang web được viết bằng MVC ( ASP.NET ) và nó thường theo mô hình làm một cái gì đó trong khung nhìn -> nhấn bộ điều khiển -> bộ điều khiển xây dựng một mô hình (gọi Trình quản lý lấy dữ liệu, xây dựng mô hình trong chính phương thức điều khiển) -> model đi vào xem -> rửa và lặp lại.
Ông nói rằng mã của chúng tôi được ghép quá chặt chẽ. Ví dụ: nếu chúng tôi muốn có một ứng dụng máy tính để bàn, chúng tôi sẽ không thể sử dụng mã hiện có của chúng tôi.
Giải pháp và cách thực hành tốt nhất mà ông nói là xây dựng API, sau đó xây dựng trang web của bạn trên API của bạn và sau đó xây dựng một ứng dụng máy tính để bàn, ứng dụng di động, v.v. rất đơn giản.
Đây dường như là một ý tưởng tồi đối với tôi vì nhiều lý do.
Dù sao, tôi dường như không thể tìm thấy bất cứ điều gì bằng cách googling có thể thảo luận về thực hành này. Có ai có bất kỳ thông tin nào về ưu, nhược điểm, tại sao bạn nên, tại sao bạn không nên đọc thêm?
Một số lý do tôi nghĩ rằng đó là một ý tưởng tồi:
Thật quá trừu tượng để chạy phần phụ trợ của bạn khỏi API. Bạn đang cố gắng làm cho nó quá linh hoạt sẽ làm cho nó trở thành một mớ hỗn độn không thể kiểm soát được.
Tất cả những thứ được xây dựng trong MVC dường như vô dụng, như vai trò và xác thực. Ví dụ: [Ủy quyền] thuộc tính và bảo mật; bạn sẽ phải tự lăn
Tất cả các lệnh gọi API của bạn sẽ yêu cầu thông tin bảo mật được đính kèm và bạn sẽ phải phát triển hệ thống mã thông báo và không có gì.
Bạn sẽ phải viết các lệnh gọi API hoàn chỉnh cho mọi chức năng mà chương trình của bạn sẽ thực hiện. Khá nhiều phương pháp bạn muốn thực hiện sẽ cần phải được chạy khỏi API. Nhận / Cập nhật / Xóa cho mỗi người dùng, cộng với một biến thể cho từng thao tác khác, ví dụ: cập nhật tên người dùng, thêm người dùng vào nhóm, v.v. và mỗi người sẽ là một lệnh gọi API riêng biệt.
Bạn mất tất cả các loại công cụ như giao diện và các lớp trừu tượng khi nói đến API. Những thứ như WCF hỗ trợ rất nhiều cho các giao diện.
Bạn có một phương thức tạo người dùng hoặc thực hiện một số tác vụ. Nếu bạn muốn tạo 50 người dùng, bạn chỉ cần gọi 50 lần. Khi bạn quyết định thực hiện phương pháp này với tư cách là API, máy chủ web cục bộ của bạn có thể đặt tên đường ống kết nối với nó và không có vấn đề gì - máy khách để bàn của bạn cũng có thể gặp phải nó, nhưng đột nhiên việc tạo người dùng hàng loạt của bạn sẽ liên quan đến việc đập API qua Internet 50 lần. tốt Vì vậy, bạn phải tạo một phương thức hàng loạt, nhưng thực sự bạn chỉ đang tạo nó cho các máy khách để bàn. Theo cách này, cuối cùng bạn phải sửa đổi API dựa trên những gì tích hợp với nó và bạn không thể tích hợp trực tiếp với nó, b) làm nhiều việc hơn để tạo ra một chức năng bổ sung.
YAGNI . Trừ khi bạn có kế hoạch cụ thể để viết hai ứng dụng hoạt động giống hệt nhau, một ứng dụng web và một ứng dụng Windows chẳng hạn, đó là một lượng lớn công việc phát triển bổ sung.
Gỡ lỗi khó hơn nhiều khi bạn không thể bước qua đầu cuối.
Rất nhiều hoạt động độc lập sẽ yêu cầu nhiều lần qua lại, ví dụ một số mã có thể có được người dùng hiện tại, kiểm tra người dùng ở vai trò quản trị viên, lấy công ty mà người dùng thuộc về, lấy danh sách các thành viên khác, gửi tất cả Một email. Điều đó sẽ yêu cầu rất nhiều lệnh gọi API hoặc viết phương thức bespoke cho tác vụ cụ thể mà bạn muốn, trong đó lợi ích duy nhất của phương thức bespoke đó là tốc độ nhưng nhược điểm sẽ là không thể thực hiện được.
Có lẽ một số lý do nữa là những điều này chỉ ra khỏi đầu của tôi.
Nó chỉ có vẻ như tôi trừ khi bạn thực sự cần hai ứng dụng giống hệt nhau, thì nó thực sự không đáng. Tôi chưa bao giờ thấy một ứng dụng ASP.NET được xây dựng như thế này, bạn phải viết hai ứng dụng riêng biệt (API và mã của bạn) và phiên bản cũng kiểm soát cả hai (nếu trang người dùng của bạn có một trường mới, bạn ' d phải cập nhật đồng thời API và mã tiêu thụ của bạn để đảm bảo không có ảnh hưởng xấu hoặc đặt nhiều công việc bổ sung để giữ cho nó mạnh mẽ).
Chỉnh sửa: Một số phản hồi tuyệt vời, thực sự bắt đầu để có được một ý tưởng tốt về tất cả những gì bây giờ có nghĩa là gì. Vì vậy, để mở rộng câu hỏi của tôi, bạn sẽ cấu trúc một ứng dụng MVC theo cấu trúc API này như thế nào?
Ví dụ: bạn có một trang web hiển thị thông tin về người dùng. Theo MVC, bạn có:
Trang HTML - (CS) hiển thị Trình điều khiển UserViewModel - Gọi GetUser () và tạo một UserViewModel mà nó chuyển đến lớp Trình quản lý xem (loại API của bạn) có phương thức GetUser.
Bộ điều khiển thực hiện GetUser () nhưng bạn cũng muốn có một ứng dụng máy tính để bàn. Điều này có nghĩa là GetUser của bạn cần được hiển thị thông qua một số loại API. Bạn có thể muốn kết nối TCP, WCF hoặc có thể là từ xa. Bạn cũng muốn có một ứng dụng di động sẽ RESTful vì các kết nối liên tục không ổn định.
Vì vậy, sau đó bạn sẽ viết một API cho từng người, một dịch vụ web WCF có phương thức GetUser () và mã chỉ thực hiện return new UserManager().GetUser()
? Và một phương pháp api web mvc 4 có làm điều tương tự? Trong khi tiếp tục gọi GetUser trực tiếp trong phương thức bộ điều khiển MVC của bạn?
Hoặc bạn sẽ chọn giải pháp hoạt động cho cả ba (dịch vụ web api REST) và xây dựng mọi thứ trên đó, vì vậy cả ba ứng dụng thực hiện cuộc gọi API (các mvc, cho máy cục bộ).
Và đây có phải chỉ là một kịch bản hoàn hảo về mặt lý thuyết? Tôi có thể thấy các chi phí lớn trong việc phát triển theo cách này, đặc biệt nếu bạn phải phát triển theo cách cho phép bạn thực hiện các thao tác theo cách RESTful. Tôi nghĩ rằng một số điều này đã được đề cập trong các câu trả lời.
Chỉnh sửa 2: Sau khi đọc thêm nội dung, tôi đã đưa ra một nhận xét bên dưới mà tôi nghĩ có thể giải thích nó. Câu hỏi là một chút câu hỏi mẹo tôi nghĩ. Nếu bạn viết back-end của bạn dưới dạng API khiến tôi bối rối khi nghĩ rằng nên có một dịch vụ web duy nhất mà mọi thứ (ứng dụng mvc, ứng dụng máy tính để bàn, ứng dụng di động) gọi để làm công cụ.
Kết luận tôi đã đưa ra là những gì bạn thực sự nên làm là đảm bảo lớp logic kinh doanh của bạn được tách rời chính xác. Nhìn vào mã của tôi, tôi đã làm điều này rồi - bộ điều khiển sẽ gọi trình GetUser()
quản lý, sau đó tạo mô hình khung nhìn từ nó để hiển thị với Chế độ xem. Vì vậy, thực sự, lớp logic kinh doanh là một API. Nếu bạn muốn gọi nó từ một ứng dụng máy tính để bàn, bạn sẽ cần phải viết một cái gì đó như dịch vụ WCF để tạo điều kiện gọi nó. Thậm chí chỉ cần có một phương thức WCF được gọi GetUser()
có chứa mã return MyBusinessLayer.GetUser()
là đủ. Vì vậy, API là logic nghiệp vụ và WCF / web api, v.v. chỉ là các tiêu chuẩn của mã để cho phép các ứng dụng bên ngoài gọi nó.
Vì vậy, có một số chi phí, trong đó bạn phải bọc lớp logic nghiệp vụ của mình trong các API khác nhau tùy thuộc vào những gì bạn cần và bạn sẽ phải viết một phương thức API cho mỗi thao tác bạn muốn các ứng dụng khác của mình thực hiện, ngoài ra bạn sẽ cần sắp xếp một cách để xác thực, nhưng đối với hầu hết các phần thì nó đều giống nhau. Dán logic kinh doanh của bạn vào một dự án riêng (thư viện lớp) và có thể bạn sẽ không gặp vấn đề gì!
Hy vọng cách giải thích này là chính xác. Cảm ơn tất cả các cuộc thảo luận / ý kiến nó đã tạo ra.