2010-05-27 18 views
5

Mam proste mały model danych przypominających następujące:Czy istnieje łatwiejszy sposób na utworzenie dostawcy danych usługi danych WCF/OData?

InventoryContext {

IEnumerable<Computer> GetComputers()

IEnumerable<Printer> GetPrinters()

}

Computer {

public string ComputerName { get; set; }

public string Location { get; set; } }

drukarki {

public string PrinterName { get; set; }

public string Location { get; set; }

}

Wyniki pochodzą ze źródła innego niż SQL, więc dane te nie pochodzą z Entity Framework połączonego z bazą danych.

Teraz chcę udostępnić dane za pośrednictwem usługi OData WCF. Jedynym sposobem znalazłem się zrobić do tej pory tworzy własną dostawca danych Query Service, za tym poradniku na blogu:

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

... co jest super, ale wydaje się to całkiem zaangażowanych przedsięwzięcia. Kod dostawcy byłby czterokrotnie dłuższy niż cały mój model danych, aby wygenerować wszystkie zestawy zasobów i definicje właściwości.

Czy między Entity Framework jest coś w rodzaju generycznego dostawcy, a pisanie własnego źródła danych od zera? Może jakiś sposób na zbudowanie źródła danych obiektu lub czegoś takiego, aby magiczne jednorożce z kolekcji WCF mogły pobierać dane i jeździć w kierunku zachodu słońca bez konieczności jawnego kodowania dostawcy?

+1

Istnieje * łatwiejszy * sposób zapytać, czy coś jest łatwiejsze. :) –

Odpowiedz

1

Możesz użyć wbudowanego Reflection Provider.

Dodaj następujące do InventoryContext:

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

i modyfikować podmiotów w następujący sposób (trzeba dodać odwołanie do System.Data.Services.Client do projektu):

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

Po” Zrobiliśmy to, po prostu wskaż swoją usługę danych w InventoryContext, tak:

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

To powinno być wszystko, co musisz zrobić. InventoryContext będzie musiał mieć konstruktor bez parametrów.

2

Możesz użyć tak zwanego "dostawcy refleksji". Zakłada się, że masz własność (lub wiele właściwości), która zwraca IQueryable (T to twój typ jednostki). Obejrzyj ten film wideo, aby uzyskać proste "Jak", aby zacząć. http://msdn.microsoft.com/en-us/data/cc745968.aspx

0

Można użyć zestawu narzędzi WCF Data Services.

Został napisany pierwotnie przez grupę ludzi z Microsoft i pozwala na bardzo elastyczny sposób tworzenia usług OData, które nie są oparte na Entity Framework.

Jonathon Carter dokonał doskonałego demo w zeszłym roku, owijając usługę OData wokół Mongo DB.

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

Kod jest również dostępny na codeplex http://wcfdstoolkit.codeplex.com/

nadzieję, że to pomaga.

Powiązane problemy