Как динамически загрузить строку подключения из web.Config в Entity Framework 4.0? - PullRequest
1 голос
/ 01 марта 2010

В LinqToSql я мог бы написать пустой конструктор, если бы для строки подключения было установлено значение (Нет). В этом пустом конструкторе я мог бы затем извлечь строку подключения из web.Config так:

    public CustomDataDataContext() :
  base( ConfigurationManager.ConnectionStrings[ "DB" ].ConnectionString, mappingSource )
{
  OnCreated();
}

Я пытаюсь сделать то же самое сейчас в Entity Framework 4.0. Возможно ли это как-то? Я не могу избавиться от созданного ими безпараметрического конструктора. Я бы предпочел не переносить контекст в новый класс, который передает контексту строку подключения к контексту, если мне это не нужно.

1 Ответ

3 голосов
/ 01 марта 2010

Хотя конструктор без параметров, который автоматически находит соединение, кажется хорошей идеей, он тесно связывает контекст объекта с файлом конфигурации.

Он также вводит некоторую «магию» в том, что у потребителя нет четкого способа определить, как изменить строку соединения, связанную с конструктором без параметров (кроме чтения источника).

Полагаю, мой ответ таков: независимо от того, позволяет ли Entity Framework вам это делать, вы, вероятно, не должны этого делать. Вместо этого используйте фабрику и достигните той же гибкости, не привязывая контекст объекта к системе конфигурации:

public interface ICustomDataContextFactory
{
    CustomDataContext Create();
}

public class CustomDataContextFactory : ICustomDataContextFactory
{
    private readonly string _connectionStringName;

    public CustomDataContextFactory(string connectionStringName)
    {
        _connectionStringName = connectionStringName;
    }

    public CustomDataContext Create()
    {
        var connectionString = ConfigurationManager.ConnectionStrings[_connectionStringName].ConnectionString;

        return new CustomDataContext(connectionString);
    }
}

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

Я понимаю, что вы сказали, что не хотите вводить новый класс, через который проходит строка подключения. Я понял это как класс, производный от CustomDataContext, а не от фабрики, что является новой концепцией здесь.

(Этот ответ действительно относится только к производственному коду. Уловка конструктора без параметров полезна в эфемерном коде, например, для проверки концепции.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...