Theo như viết một ứng dụng tận dụng cả ASP.NET/MVC và WCF, thì nó không tuyệt vời. WebAPI có thể đã cải thiện vấn đề, nhưng trong một dự án tôi quen với việc sử dụng WCF và MVC trong cùng một ứng dụng, cuối cùng họ đã duy trì hai bộ mô hình khác nhau để thể hiện cùng một khái niệm - một cho mã WCF và một cho MVC mã. Bạn có thể tưởng tượng tất cả những người lập bản đồ họ phải viết để dịch những thứ giữa hai mô hình - có rất nhiều dòng mã có thể có / nên tránh.
Một phần lý do tại sao điều này xảy ra là các đối tượng yêu cầu và phản hồi WCF nên được chú thích bằng [DataContract] và các thuộc tính của chúng với [DataMember], trong khi MVC không yêu cầu điều này. Mặt khác, MVC thành ngữ sẽ muốn ViewModels, có các mục tiêu khác với WCF DataContuces. Tất nhiên, có thể việc sử dụng hai bộ đối tượng miền đầy đủ có liên quan đến luật của Conway so với xung đột WCF & MVC, nhưng đáng để chỉ ra rằng WCF và MVC có các mục tiêu và yêu cầu khác nhau về đầu ra và đầu vào.
Cá nhân, tôi là một phần để phát triển API back end dịch vụ đơn giản nhưng mạnh mẽ, đặc biệt khi bạn có thể muốn nhiều khách hàng. Tôi nghĩ rằng sự ra đời của các khung JavaScript MVVM và micro-MVC tuyệt vời làm cho điều này trở thành một lựa chọn tự nhiên, vì viết mã ứng dụng bằng BackboneJS , KnockoutJS và các khung khác cho phép môi trường phát triển có khả năng. Sau đó, bạn có thể sử dụng phần cuối trong micro MVC mà bạn chọn để xây dựng ứng dụng web hoặc trên máy khách di động và các đối tác của bạn cũng có thể sử dụng cùng một API từ xa.
Gợi ý
WebAPI hoặc Service Stack có thể là ứng cử viên tốt để xây dựng API back end của bạn. Tôi khuyên dùng Service Stack, vì tôi đã sử dụng nó trong vài tháng qua và nhận thấy đây là một sự thay thế tuyệt vời cho WCF. Tôi hiện đang viết một loạt bài hướng dẫn về ngăn xếp dịch vụ trên blog của mình .
Nhóm dịch vụ duy trì nhóm đã đăng một ứng dụng ví dụ bằng cách sử dụng khung để phát triển StackOverflow giống như bản sao, cho thấy một mô hình phát triển mà tôi tin là đặc biệt hấp dẫn. Nó liên quan đến một dịch vụ dựa trên mô hình đơn giản, dựa trên mô hình mà bạn có thể tưởng tượng được sử dụng bởi một trang web MVC, một ứng dụng di động hoặc bất cứ thứ gì khác một cách dễ dàng. Các mục tiêu thiết kế của ServiceStack rõ ràng khuyến khích một mô hình sẽ dẫn đến ít khớp nối hơn giữa máy khách và máy chủ. Ý tưởng là để tránh các API trò chuyện với các cuộc gọi như GetCustomersInRegionWithSearchTerm(int regionId, string searchTerm)
ủng hộ ít phương thức hơn. Bạn có thể thực hiện điều tương tự trong ngăn xếp dịch vụ như thế này:
[Route("/customers", "GET"]
[Route("/customers/search/{SearchTerm}", "GET"]
[Route("/customers/region/{Region}", "GET"]
[Route("/customers/region/{Region}/search/{SearchTerm}", "GET"]
public class Customers
{
public int? RegionId { get; set; }
public string SearchTerm { get; set; }
}
public class CustomersService : Service
{
public object Get(Customers request) {
// handle request
return new CustomersResponse();
}
}
Lợi ích, để đôi mắt của tôi, đó là thay vì có lây lan logic kinh doanh của bạn ra hơn rất nhiều và rất nhiều các phương pháp riêng biệt GetCustomersInRegionWithSearchTerm(int regionId, string searchTerm)
, GetCustomersInRegion(int regionId)
, GetCustomersWithSearchTerm(string searchTerm)
, GetCustomers()
, đó là tất cả ở một nơi. Điều này sẽ dẫn đến mã duy trì nhiều hơn.
Thật trùng hợp, Stack Exchange đã thuê tác giả Service Stack ban đầu . Anh tiếp tục cam kết tích cực với dự án Service Stack.
Tôi đặc biệt thích hàng đợi tin nhắn cho một số thứ nhất định - và trong khi WCF cho phép điều này, WebAPI thì không. ServiceStack cho phép cùng một dịch vụ web được gọi thông qua MQ. Để biết thêm thông tin về điều này, hãy xem Redis MQ Host tại: github.com/ServiceStack/ServiceStack/wiki/Messaging-and-redis