2012-03-01 49 views
9

Tôi biết rằng không phải ai cũng sử dụng một kiến ​​trúc triệt để khi phát triển một ứng dụng MVC nhưng chúng ta hãy giả sử tôi có kiến ​​trúc như sau:Hiểu được cách tiếp cận Web API mới

App.Core --> Class Library (POCO or Domain objects) 
App.Data --> Class Library (Repository and Entity Framework) 
App.Service --> Class Library (Service layer with all business logic) 
App.Web --> asp.net MVC 3.0 project 

App.Data --> Has a reference to App.Core 
App.Service --> Has a reference to App.Core and App.Data 
App.Web --> Has a reference to App.Core and App.Service 

Bên trong MVC của chúng tôi ứng dụng chúng tôi cố gắng sau phương pháp này:

  • Bên trong điều khiển của chúng tôi (trong vòng một phương pháp), chúng tôi nhanh chóng một ViewModel.
  • Chúng tôi lấp đầy các phương thức gọi ViewModel đó từ App.Service Layer
  • Sau khi ViewModel được điền, chúng tôi sẽ trả lại View (vì vậy, chế độ xem hiện đã được nhập mạnh).

Điều này xảy ra 99,9% thời gian. Nó là sạch sẽ, chúng tôi thích nó và nó tận dụng chính nó khá tốt .. etc!

Bây giờ câu hỏi của tôi là như sau:

Nếu chúng ta quyết định di chuyển ứng dụng của chúng tôi để MVC 4.0 và bắt đầu sử dụng mới Web API cách tiếp cận , Tôi không chắc tôi hoàn toàn hiểu nơi (hoặc làm thế nào) nó sẽ phù hợp với kiến ​​trúc hiện tại của chúng ta?

Hãy nhớ rằng chúng tôi sẵn sàng thay đổi điều này!

Chúng ta có nên tạo một lớp App.WebAPI mới nằm giữa App.Service và App.Web không? Điều này có nghĩa là bên trong Bộ điều khiển của chúng tôi, chúng tôi sẽ không cần phải gọi trực tiếp cho App.Service nữa mà thay vào đó là lớp App.WebAPI mới?

Hoặc, để lại API Web bên trong lớp App.Web và làm cho Bộ điều khiển gọi các APIControllers khác mà lần lượt sẽ gọi lớp App.Service?

Không chắc chắn nếu tôi có ý nghĩa gì ở đây ... nhưng vui lòng đề xuất bất kỳ điều gì vì tôi tò mò về các yếu tố đầu vào khác nhau.

Cảm ơn

Trả lời

13

Có một vài trường hợp để xem xét:

Bạn có muốn làm cho Web API này đóng vai trò như lớp dịch vụ và truy cập dữ liệu cho các ứng dụng MVC của bạn? Nếu, có, sau đó bạn hoàn toàn nên loại bỏ tất cả các tài liệu tham khảo của App.Service từ dự án ASP.NET MVC và có nó truy vấn Web API thay vì lấy dữ liệu. Trong trường hợp này, Web API nằm giữa ứng dụng ASP.NET MVC của bạn và truy cập dữ liệu. Đây là API Web nói chuyện với lớp dịch vụ và hiển thị nó qua giao thức HTTP.

Hoặc bạn có muốn cung cấp API bổ sung cho trang web của mình có thể được sử dụng bởi các ứng dụng khách khác (không phải là trình duyệt web) không? Trong trường hợp này, ứng dụng ASP.NET MVC và Web API nằm trên cùng một lớp. Cả hai truy vấn lớp dịch vụ của bạn để điền vào các mô hình xem, nó chỉ là trong trường hợp của ứng dụng MVC bạn đang chuyển các mô hình xem đó đến lượt xem mà chuyển đổi chúng thành HTML trong khi trong lớp Web API, bạn có thể sử dụng các mô hình xem hơi khác nhau vẫn được phổ biến từ tầng dịch vụ của bạn và được truyền cho máy khách sử dụng cơ chế tuần tự tương ứng (JSON, XML, ...)

+2

Tôi tin rằng cách tiếp cận thứ hai của bạn là những gì chúng tôi đang tìm kiếm. Xem xét chúng tôi có thể có các khách hàng khác (iPad, iPhone, v.v ...). Vì vậy, kết luận là có cả MVC và Web API ngồi trong cùng một lớp. Làm cho cả hai tương tác với Lớp Dịch vụ (giữ lại logic nghiệp vụ) và lần lượt, điền vào các Mô hình Chế độ xem khác nhau dựa trên người được gọi là gì. Đúng không? – Vlince

+0

@Vlince, chính xác. Bạn đã tóm tắt rất tốt. –

+0

Cảm ơn bạn đã trợ giúp :-) – Vlince

1

Tôi biết điều này là muộn nhưng tôi đã thực sự tìm kiếm lời khuyên tương tự và tôi tìm thấy bài đăng này.

Sẽ không có "cả MVC và Web API ngồi trong cùng một lớp" có nghĩa là nhiều công việc bảo trì trên mã, hoặc có thể trùng lặp mã? web mvc không được coi là trình duyệt của khách hàng? .. với tôi nó có ý nghĩa để có WebAPI lớp duy nhất của bạn cho tất cả mọi người khác và lần lượt nó sẽ gọi lớp dịch vụ của bạn để xử lý.

Lợi ích của việc rời khỏi cả API Web và MVC nói trực tiếp với lớp dịch vụ là gì? API web có thể là trình bao bọc xung quanh lớp dịch vụ không?

+0

Tôi nghĩ rằng, trong phương án thứ hai, Web API sẽ chỉ được sử dụng để trưng ra một số phần của lớp dịch vụ với Net, vì vậy các hành động của nó sẽ hoàn toàn không có logic (chỉ cần gọi tới lớp dịch vụ). Nó là một proxy rất mỏng, vì vậy nó dễ bảo trì và không có cơ hội có mã trùng lặp ở đó. –

+0

Ví dụ khái niệm: Bạn có một trang web MCV đầy đủ chức năng, hy vọng với kiến ​​trúc được mô tả ở trên hoặc một cái gì đó gần với nó. Giờ đây, người quản lý của bạn cho biết bạn cần ứng dụng dành cho thiết bị di động. Bạn cần một lớp khác. Giả sử trang web của bạn có thông tin đăng nhập. Đăng nhập này làm cho một cuộc gọi dịch vụ chuyển tên người dùng/mật khẩu và sau khi thành công trả về một hồ sơ hoặc một trang lỗi trên trang web đầy đủ của bạn. API nằm giữa ứng dụng dành cho thiết bị di động và lớp dịch vụ, cùng một lớp với trang web nhưng trả lại một số JSON thay vì {success: true, UID: some-number} cho phép điện thoại vẽ trang hồ sơ theo phương thức hiển thị của riêng nó. –

Các vấn đề liên quan