Источники данных в ADO.NET Data Services

ADO.NET Data Services позвоялет строить REST-сервисы поверх какой-то готовой модели данных. Очень часто мы видим примеры сервисов ADO.NET Data Services на основе Entity Data Model или модели LINQ to SQL. Однако, это не единственные сценарии. Давайте посмотрим как это работает в действительности.

Как мы помним, при создании сервиса, создается класс-наследник от базового generic-класса DataContext<>. В generic-параметре мы как раз указываем класс, реализующий модель данных.

На самом деле, при обращении к сервису создается новый экзмепляр этого класса и производится поиск полей и свойств, которые имеют тип IQueryable. Если ADO.NET Data Services находит в этом классе свойства таких типов, то они предоставляеются через сервис для работы с ними. Теперь независимо от того, что на самом деле из себя представляет модель данных мы можем строить запросы к этому сервису, используя стандартный синтаксис URI.

Что это нам дает? Благодаря этому мы можем строить свои модели данных, которые используют информацию из реляционного источника, файловой системы, другого веб-сервиса, каких-то текстовых, XML файлов, и т.д. Например, мы можем построить модель данных следующим образом:

public class MyDataModel
{
    public IQueryable<string> Data1
    {
        get
        {
            string[] data = GetData();
            return data.AsQueryable();
        }
    }
}

В этом примере мы возвращаем коллекцию строк, однако мы можем построить более сложную модель данных, которая будет работать с какими-то сущностями. Для этого нам нужно создать класс, содеращий нужные нам поля и пометить этот класс атрибутом DataServiceKey, в параметрах которого указать ключевое поле:

[DataServiceKey("ID")]
public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
}

После этого можно предоставить коллекцию этих объектов через сервис.

public class MyDataModel
{
    public IQueryable<Person> Persons
    {
        return ...;
    }
}

Атрибут DataServiceKey является обязательным, иначе ADO.NET Data Services не сможет понять что является ключевым полем.

Таким образом, для того, чтобы создать собственную модель данных мы должны создать совершенно обычный класс, который содержит свойства, возвращающие интерфейс IQueryable. Однако, таким образом мы реализовали read-only модель данных. Для того, чтобы эту модель данных можно было обновлять, необходимо реализовать интерфейс IUpdatable уже у самого класса модели данных. Но об этом в следующий раз :)