2013-04-14 47 views
18

Tôi sắp tạo một ứng dụng web đơn giản và tôi tự hỏi nếu tôi nên sử dụng ASP.NET MVC 4 tính năng mới Web API.Làm thế nào để kết hợp Web Api và MVC tốt nhất trong một ứng dụng web

Cách tốt nhất để làm điều này là gì?

tôi đã thực hiện một số nghiên cứu và tôi phát hiện ra có hai tùy chọn:

Option 1

Tận dụng tối Api Web dịch vụ của tôi lớp và gọi nó là từ bộ điều khiển để đọc dữ liệu/ghi, và đưa ra các xem bằng cách sử dụng các kiểu xem và dao cạo.

Option 2

Tận dụng Web Api lớp dịch vụ của tôi và gọi nó là trực tiếp từ giao diện sử dụng Javascript.

Tôi không phải là người hâm mộ lớn của Option 2 vì tôi cảm thấy như tôi đang bỏ qua bộ điều khiển sẽ chỉ được sử dụng để chuyển hướng giữa các trang. Bên cạnh đó tôi thích sử dụng dao cạo hơn là Javascript.

Và nếu tôi chọn Option 1 tôi có phải tạo một cá thể của một API Web trong bộ điều khiển không? bởi vì điều này có vẻ như tôi đang làm điều gì đó sai.

Tùy chọn tốt nhất là gì? Có bất kỳ lựa chọn nào khác mà tôi chưa xem xét không?

Và nếu bạn có thể đưa ra một số tài liệu tham khảo hoặc sách có thể giúp tôi, tôi sẽ đánh giá cao nó.

Cảm ơn.

+1

Tôi sẽ chọn tùy chọn đơn giản nhất, với tùy chọn 2 dường như đơn giản hơn trong hai tùy chọn được trình bày. – Kane

Trả lời

15

Tôi thường có một lớp khác (có thể là một dự án/lắp ráp khác tùy thuộc vào kích thước và độ phức tạp của ứng dụng của bạn) cho các quy tắc kinh doanh của tôi. Bạn có thể gọi tới số dịch vụ doanh nghiệp hoặc bất kỳ điều gì phù hợp với trường hợp của bạn.

Vì vậy, cả hai Bộ điều khiển MVCBộ điều khiển API sử dụng lớp này; giữ cho ứng dụng khô ráo. Cá nhân tôi thích chỉ giữ các hoạt động phức tạp trong các lớp nghiệp vụ của tôi, điều này có nghĩa là nếu tôi cần đọc một cái gì đó từ lớp kiên trì của mình để hiển thị trong quan điểm của tôi, tôi làm điều đó trực tiếp trên bộ điều khiển MVC. Đây là vấn đề sở thích cá nhân nhưng tôi thích đi theo cách CQRS.

Vì vậy, các bộ điều khiển MVC sẽ thực hiện các dịch vụ kinh doanh này (hoặc chúng sẽ được đưa vào bộ điều khiển của bạn nếu bạn đang sử dụng IoC). Đối với các hoạt động đọc, bạn có thể chọn để đi thẳng đến lớp kiên trì của bạn hoặc sử dụng một chiến lược đọc khác.

Điều tương tự cũng xảy ra với bộ điều khiển API của bạn, họ sẽ sử dụng lớp dịch vụ "phổ biến" này.

Bạn không cần phải khởi tạo Bộ điều khiển API của mình trên Bộ điều khiển MVC. Tiêu thụ bộ điều khiển Api Web của bạn thông qua AJAX là ok nếu bạn đang phát triển SPA hoặc tương tự.

Không có cách nào đơn lẻ để cấu trúc ứng dụng của bạn, chỉ có những cách khác nhau và mỗi cách có nhiều hoặc ít đau kèm theo.

Nếu bạn đang xem xét giới thiệu các thử nghiệm trong các ứng dụng của mình (và bạn nên :)); thì bạn nên cấu trúc nó theo cách dễ dàng để kiểm tra từng phần của nó.

Chỉ 2 xu của tôi.

+0

Cảm ơn Raciel, tôi nghĩ tốt hơn nếu tôi sử dụng bộ điều khiển MVC khi tải trang lỗ và sau đó tiêu thụ bộ điều khiển API qua Ajax trên các thao tác nhỏ mà không cần tải – kbaccouche

+0

CQRS chỉ nói một phương thức nên trả về thông tin (truy vấn) hoặc thực hiện một số hành động thay đổi trạng thái (lệnh), và không phải cả hai. Mặc dù, có nhiều hơn một chút so với điều đó. Dù bằng cách nào, nó nói không có gì về, hoặc hỗ trợ, trực tiếp truy cập vào sự kiên trì của bạn từ một dịch vụ (mà chỉ nên là một wrapper để lộ logic kinh doanh). – Suamere

4

Toàn bộ điểm Web API là dịch vụ RESTful không trạng thái. Sẽ không bao giờ là một ví dụ của nó nếu bạn làm đúng. Tôi nhận ra câu hỏi này là cũ và bạn có thể cá nhân đã học được điều này, nhưng câu trả lời không phải là nhiều cho bạn vì nó là một câu trả lời cho một câu hỏi thường gặp.

Lưu ý rằng khi nói về API Web, thường xuyên hơn không, mọi người đang nói về ApiControllers và không phải là "Bộ điều khiển" MVC cơ bản có tuyến đường và biến chúng thành Chế độ xem.

Vì vậy, trong dự án của bạn, bạn có thể có một số "Bộ điều khiển" làm một số logic xem cơ bản, nhưng không có logic nghiệp vụ. Đừng nhầm lẫn điều đó với Lớp dịch vụ của bạn, đây là một trình bao bọc cho truy cập Logic và Kinh doanh của bạn.

Tôi và nhiều người cho rằng ApiControllers không nên được trộn lẫn với ứng dụng MVC của bạn. Hãy nhớ rằng MVC không kết hợp tốt với Web API. Như Filip W nói:

Nhiều khái niệm được sử dụng bởi API Web và MVC, mặc dù tương tự tại cái nhìn đầu tiên, thực sự không tương thích. Ví dụ, thuộc tính Web API thuộc tính System.Web.Http.Filters.Filter và MVC là System.Web.Mvc.Filter - và chúng không thể hoán đổi cho nhau.

câu trả lời linh hoạt Hầu hết

Vì vậy, những gì bạn làm là tạo một subdomain tên api.YourWebsite.com, và xây dựng một dự án ApiController Web API mới có. Dự án Web API đó KHÔNG làm nhiều hơn việc khởi tạo và trưng ra Logic nghiệp vụ thông qua ApiControllers và Dependency Injection.

Alternative 1

Kiến trúc hướng dịch vụ là tất cả về việc tái sử dụng. Nếu bạn muốn giữ các ứng dụng của bạn KHÔ, bạn chắc chắn sẽ rơi vào SOA. Mặc dù, mọi tình huống đều khác nhau. Nếu bạn sẽ không bao giờ sử dụng cùng một logic kinh doanh trong trang web này trong bất kỳ ứng dụng nào khác (máy tính để bàn, android, máy tính bảng, ewPhones, v.v.), thì bạn có một phương pháp thay thế.

Tạo Busines Lớp logic của bạn dưới dạng một Dự án khác và truy cập trực tiếp từ ứng dụng web của bạn. Khi bộ điều khiển Javascript của bạn (Angular/Razor?) Thực hiện cuộc gọi, họ có thể gọi vào ViewModels và/hoặc Codebehind của bạn hoặc một cái gì đó tương tự, có thể khởi tạo Business Logic và truy cập trực tiếp nó. Không cần dịch vụ nếu mọi thứ ở ngay đó và sẽ không được sử dụng lại.

Alternative 2

Đi trước và đặt ApiControllers Web API của bạn trong cùng một dự án. Tuy nhiên, hãy chắc chắn bạn tách chúng thành các thư mục khác nhau từ bộ điều khiển MVC của bạn "." Tuy nhiên, khi Bộ điều khiển Javascript của bạn thực hiện cuộc gọi, họ sẽ thực hiện cuộc gọi Định tuyến đến trang web của bạn để trả lại không trạng thái. Không trộn các ApiControllers không trạng thái với các ViewModels của bạn và mã MVC khác.

Nhược điểm của điều này là thiếu SOC.Bây giờ bạn đã có dịch vụ Layer và UI-Layer hỗn hợp, và UI-Layer của bạn buộc phải truy cập vào Business Logic Layer (DLL) của bạn. Có gì sai với điều đó nếu Phương án 1 đã làm điều đó?

Vâng, có gì sai là Phương án 1 là một ứng dụng nhỏ không có chỗ cho tăng trưởng. Bất kỳ điều gì khác (Kế hoạch ban đầu, hoặc Phương án 2 ở đây) nên có giao diện người dùng không có đầu mối nào mà Logic nghiệp vụ (hoặc Persistence) thậm chí tồn tại. Họ nên đi về doodies của họ unawares của thế giới phụ trợ.

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