2009-04-12 31 views
12

Tôi đang phát triển một ứng dụng bao gồm dịch vụ WCF và máy khách ASP.NET MVC của nó. Trang web ASP.NET MVC phải hiển thị một mạng lưới các đối tượng - nói, các sản phẩm. Các sản phẩm này được lưu trữ trong cơ sở dữ liệu có thể truy cập thông qua dịch vụ WCF. Vì vậy, một nơi nào đó bên trong một bộ điều khiển MVC tôi gọi phương pháp của WCF dịch vụ mà trả về cho tôi một loạt các sản phẩm mà tôi cần phải hiển thị.Thực hiện máy nhắn tin qua dịch vụ WCF

Vì vậy, câu hỏi của tôi là gì? Tôi muốn triển khai chức năng máy nhắn tin cho lưới sản phẩm của mình, bởi vì có thể sẽ có rất nhiều sản phẩm. Vì vậy, có một số cách để làm điều đó:

  1. điều khiển của tôi có thể nhận được toàn bộ danh sách các sản phẩm và chỉ trong bộ nhớ phân trang
  2. WCF có thể chọn tất cả các sản phẩm và lưu trữ chúng ở đâu đó trong bộ nhớ cache của nó, sau đó vượt qua cho bộ điều khiển chỉ một phần của họ, theo số trang được yêu cầu.
  3. WCF chỉ có thể chọn một phần của sản phẩm từ cơ sở dữ liệu, theo số trang được yêu cầu.
  4. WCF có thể trả về IQueryable cho bộ điều khiển, và sau đó bộ điều khiển sẽ chọn bất cứ điều gì anh ta muốn bất cứ khi nào anh ta muốn.

Theo như tôi hiểu (và sửa tôi nếu nó không đúng), tùy chọn đầu tiên là vô ích, vì vậy tôi phải chọn giữa những người khác.

Tùy chọn thứ hai sẽ làm lãng phí bộ nhớ máy chủ của tôi.

Tùy chọn thứ ba là OK, nhưng có vẻ như hơi xấu xí khi triển khai phân trang ở phía WCF.

Và tùy chọn thứ tư có vẻ khó hiểu. Tôi thực sự vượt qua một số loại truy vấn cho khách hàng, và sau đó ông truy vấn cơ sở dữ liệu của tôi một mình, thông qua dịch vụ WCF. Tôi không thể tìm ra cách để thực hiện điều này một cách chính xác.

Vì vậy, bạn có thể vui lòng giúp tôi chọn đúng cách để triển khai tính năng này không?

Trả lời

15

Lớp cơ sở dữ liệu phía sau của bạn trông như thế nào? Nếu bạn đang sử dụng LINQ (-to-SQL hoặc -to-Entities), bạn có thể thực hiện phân trang thông qua WCF bằng cách chỉ định kích thước trang và số trang bạn muốn, sau đó sử dụng toán tử "Skip" và "Take" của LINQ để tìm nạp trang yêu cầu - một cái gì đó gần như thế:

[ServiceContract] 
public interface IFetchData 
{ 
    [OperationContract] 
    public List<Data> GetData(int pageSize, int pageNumber) 
} 

và sau đó thực hiện nó một cái gì đó như thế này (giản thể):

public class FetchDataService : IFetchData 
{ 
    public List<Data> GetData(int pageSize, int pageNumber) 
    { 
     var query = yourContext.DataTable 
        .Skip((pageNumber - 1) * pageSize) 
        .Take(pageSize); 

     return query.ToList(); 
    } 
} 

mà có thể hữu ích cho bạn ??

Marc

+0

Có, tôi đang sử dụng LINQ-to-SQL. Vì vậy, những gì bạn đang cung cấp thực sự là lựa chọn thứ ba của tôi. Vâng, tôi có thể sẽ đi cho nó. Tôi nghĩ về một số loại thực hiện lười biếng, khi các dịch vụ WCF vượt IQueryable cho khách hàng mà không thực sự chọn bất cứ điều gì từ db. Nhưng tôi không thể tìm ra cách để làm điều đó –

+0

Vâng, ngay bây giờ, với các dịch vụ hiện tại, tôi nghĩ rằng đi vòng quanh IQueryable có thể là một chút khó khăn để làm. Nhưng nếu bạn xem video MIX'09 về "Dịch vụ RIA" - đó chính xác là những gì MS đang xây dựng bây giờ cho Silverlight 3 - điều đó có thể sẽ giải quyết tất cả các vấn đề của bạn :-) –

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