Контроль за инстанциацией модели данных в ADO.NET Data Services

При работе с сервисами ADO.NET Data Services мы ссылаемся на модель данных используя generic-параметр. При этом экземпляр класса, реализующего модель данных создает уже инфраструктура ADO.NET Data Services, используя при этом конструктор без параметров.

Зачастую такого поведения вполне достаточно – создаем модель данных, в конфигурационном файле прописываем строку соединения и все работает. Тем не менее, можно встретить сценарии, когда необходимо вмешаться в этот процесс.

Причины могут быть самыми разнообразными:

  • Необходимо хранить строку соединения за пределами конфигурационного файла;
  • Необходимо создавать не сам класс DataContext, а его наследника (в котором каким-то образом изменено стандартное поведение);
  • Класс DataContext не имеет конструктора без параметров (да-да, и такое тоже бывает:));
  • и т.д.

Во всех этих и других сценариях платформа ADO.NET Data Services предлагает нам достаточно красивый способ решения проблемы. Все, что необходимо сделать – это переопределить метод CreateDataSource() базового класса.

public class WebDataService1 : DataService<DataClasses1DataContext>
{
    public static void InitializeService(IDataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
    }

    protected override DataClasses1DataContext CreateDataSource()
    {
        return base.CreateDataSource();
    }
}

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

public class WebDataService1 : DataService<DataClasses1DataContext>
{
    public static void InitializeService(IDataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
    }

    protected override DataClasses1DataContext CreateDataSource()
    {
        return new DataClasses1DataContext("some connection string");
    }
}