Data Services sits above a Data Service Provider, which is responsible for interacting with the underlying Data Source on behalf of the Data Service.
Data Services ships with some internal providers, and makes it possible for you to create custom providers too.
So the obvious question is...
Creating a Custom Data Service Provider is a fair amount of work, which of course provides big dividends like, allowing people to:
But before you jump into creating a custom provider, see if you fall into one of the following camps, all of which have a much easier solution:
If you plan on putting a Data Service over the Entity Framework the answer is no you don't need to write a custom provider.
Data Services has an implementation that talks to the Entity Framework in the box. You simply point your DataService at your strongly typed ObjectContext, and that’s it:
public class NorthwindDataService: DataService<NorthwindEntities>
In this example NorthwindEntities is your strongly typed ObjectContext representing the Northwind database.
For a good example of an OData Service built using the Entity Framework check out this post.
If you want to create a Data Service over a LINQ to SQL data source you should take a look at this project on Code Gallery.
It includes sample code you can use to extend your strongly typed DataContext class to implement the IUpdatable interface.
This in conjunction with the Reflection Provider means you can use your LINQ to SQL DataContext just like an Entity Framework ObjectContext:
public class NorthwindDataService: DataService<NorthwindDataContext>
If you have your own class that can represent your Data Source, and it has a number of strongly typed IQueryable properties like this:
public class MyDataSource { public IQueryable<Product> Products { get {…} } public IQueryable<Categories> Categories { get {…} } }
The built-in reflection provider can turn this into a read-only service and infer ResourceSets, Types and Properties automatically.
You can even make this read-write by extending your class to implement IUpdatable:
public class MyDataSource: IUpdatable In fact this is exactly how the LINQ to SQL example above works.
For a good example of an OData Service created using the reflection provider check out Tip 56.
The reflection provider is very useful for some scenarios. But is has a number of limitations that might disqualify it for your scenario:
If any of these are important it’s time to create a Custom Data Service Provider…
This series of posts will grow to cover all of the major DSP interfaces and show case lots of scenarios
Part 1 – Intro Part 2 – IServiceProvider and DataSources Part 3 – IDataServiceMetadataProvider Part 4 – Minimal Running ServicePart 5 – QueryPart 6 – Query InteractionsPart 7 – UpdatesPart 8 - Relationships Part 9 - Untypedpossible future installments… Part 10 – ETagsPart 11 – Friendly FeedsPart 12 – Streaming Part 13 – Advanced Paging