2010-05-27 26 views
5

Tôi có một mô hình dữ liệu đơn giản chút giống như sau:Có cách nào dễ dàng hơn để tạo Nhà cung cấp Truy vấn Dịch vụ Dữ liệu WCF/OData không?

InventoryContext {

IEnumerable<Computer> GetComputers()

IEnumerable<Printer> GetPrinters()

}

Computer {

public string ComputerName { get; set; }

public string Location { get; set; } }

Printer {

public string PrinterName { get; set; }

public string Location { get; set; }

}

Kết quả đến từ nguồn không phải SQL, do đó dữ liệu này không đến từ khung thực thể được kết nối với cơ sở dữ liệu.

Bây giờ tôi muốn hiển thị dữ liệu thông qua dịch vụ ODF WCF. Cách duy nhất tôi đã tìm thấy để làm điều đó cho đến nay đang tạo ra cung cấp dịch vụ truy vấn dữ liệu của riêng tôi, mỗi blog của hướng dẫn này:

http://blogs.msdn.com/alexj/archive/2010/01/04/creating-a-data-service-provider-part-1-intro.aspx

... đó là rất tốt, nhưng có vẻ như một công việc khá phức tạp. Mã cho nhà cung cấp sẽ dài hơn 4 lần so với toàn bộ mô hình dữ liệu của tôi để tạo tất cả các tập tài nguyên và định nghĩa thuộc tính.

Có điều gì giống như nhà cung cấp chung ở giữa Khung thực thể và viết nguồn dữ liệu của riêng bạn từ số không? Có lẽ một số cách để xây dựng một nguồn dữ liệu đối tượng hoặc một cái gì đó, để kỳ lân WCF kỳ diệu có thể lấy dữ liệu của tôi và đi xe vào hoàng hôn mà không cần phải mã một cách rõ ràng các nhà cung cấp?

+1

Có cách * dễ dàng hơn * để hỏi xem có điều gì dễ hơn không. :) –

Trả lời

1

Bạn có thể sử dụng số được xây dựng trong Reflection Provider.

Thêm dòng sau vào InventoryContext của bạn:

IQueryable<Computer> Computers { get { return GetComputers().AsQueryable(); } } 
IQueryable<Printer> Printers { get { return GetPrinters().AsQueryable(); } } 

Và sửa đổi các thực thể như sau (bạn sẽ cần phải thêm một tham chiếu đến System.Data.Services.Client để dự án của bạn):

using System.Data.Services.Common; 

[DataServiceKey("ComputerName")] 
public class Computer 
{ 
    public string ComputerName { get; set; } 
    public string Location { get; set; } } 
} 

[DataServiceKey("PrinterName")] 
public class Printer 
{ 
    public string PrinterName { get; set; } 
    public string Location { get; set; } } 
} 

Khi bạn' đã thực hiện điều đó, chỉ cần chấm dứt dịch vụ dữ liệu của bạn tại InventoryContext, như sau:

public InventoryDataService : DataService<InventoryContext> 
{ 
    // This method is called only once to initialize service-wide policies. 
    public static void InitializeService(DataServiceConfiguration config) 
    { 
     config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); 
     config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
     config.UseVerboseErrors = true;   
    } 
} 

Đó là tất cả những gì bạn cần làm. Các InventoryContext sẽ cần phải có một constructor parameterless.

2

Bạn có thể sử dụng cái gọi là "nhà cung cấp phản chiếu". Điều này giả định rằng bạn có một thuộc tính (hoặc nhiều thuộc tính) trả về IQueryable (T là kiểu thực thể của bạn). Hãy xem video này để biết cách đơn giản "Cách thực hiện" để giúp bạn bắt đầu. http://msdn.microsoft.com/en-us/data/cc745968.aspx

0

Bạn có thể sử dụng bộ công cụ Dịch vụ dữ liệu WCF.

Ban đầu nó được viết bởi một nhóm người từ Microsoft và cho phép một cách linh hoạt để tạo các dịch vụ OData không dựa trên Khuôn khổ thực thể.

Jonathon Carter đã làm một bản demo tuyệt vời khi kết hợp năm ngoái gói dịch vụ OData xung quanh Mongo DB.

http://channel9.msdn.com/events/MIX/MIX11/FRM16

Mã này cũng có sẵn trên CodePlex http://wcfdstoolkit.codeplex.com/

Hope this helps.

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