Существует ли более простой способ создания поставщика запросов данных WCF / OData? - PullRequest
5 голосов
/ 27 мая 2010

У меня есть простая маленькая модель данных, похожая на следующую:

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, подключенного к базе данных.

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 11 июня 2010

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

1 голос
/ 07 января 2011

Вы можете использовать встроенный 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 должен иметь конструктор без параметров.

0 голосов
/ 03 февраля 2012

Вы можете использовать инструментарий WCF Data Services.

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

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

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

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

Надеюсь, это поможет.

...