2010-05-27 3 views
5

У меня есть простая маленькая модель данных, похожая на следующую:Существует ли более простой способ создания поставщика запросов службы данных WCF/OData?

InventoryContext {

IEnumerable<Computer> GetComputers()

IEnumerable<Printer> GetPrinters()

}

Компьютер {

public string ComputerName { get; set; }

public string Location { get; set; } }

Принтер {

public string PrinterName { get; set; }

public string Location { get; set; }

}

Результаты исходят из источника, отличного от SQL, поэтому эти данные не поступают из Entity Framework, подключенного к базе данных.

Теперь я хочу предоставить данные через службу WCF OData. Единственный способ я нашел, чтобы сделать это до сих пор создаю свой собственный поставщик услуг Data Query, в этом блоге учебник:

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

... это здорово, но кажется довольно вовлеченным предприятием. Код для провайдера будет в 4 раза длиннее моей всей модели данных, чтобы генерировать все наборы ресурсов и определения свойств.

Существует ли что-то вроде общего поставщика между Entity Framework и написанием собственного источника данных с нуля? Может быть, какой-то способ построить источник данных объекта или что-то в этом роде, чтобы магические единороги WCF могли забрать мои данные и отправиться на закат без явного кода провайдера?

+1

Существует простой способ узнать, что-то проще. :) –

ответ

1

Вы можете использовать встроенный Reflection Provider.

Добавьте следующие строки в InventoryContext:

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

и модифицировать объекты следующим образом (вам нужно добавить ссылку на System.Data.Services.Client ваш проект):

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; } } 
} 

После того как вы» сделав это, просто укажите свою службу данных в свой InventoryContext, например:

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;   
    } 
} 

Это должно быть все, что вам нужно. InventoryContext должен иметь конструктор без параметров.

2

Вы можете использовать так называемый «поставщик отражения». Это предполагает, что у вас есть свойство (или многие свойства), которое возвращает IQueryable (T - тип вашей сущности). Взгляните на это видео для простого «Как», чтобы вы начали. http://msdn.microsoft.com/en-us/data/cc745968.aspx

0

Вы можете использовать набор инструментов служб данных WCF.

Первоначально это было написано группой ребят из Microsoft и позволяет очень гибкий способ создания служб OData, которые не основаны на Entity Framework.

Jonathon Carter сделал отличную демонстрацию в смешанном прошлом году, обернув услугу OData вокруг Mongo DB.

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

код также доступен на CodePlex http://wcfdstoolkit.codeplex.com/

Надеется, что это помогает.