Внешний файл конфигурации для использования несколькими DLL

У меня есть несколько библиотек DLL, которые используются для чтения/записи данных в мою базу данных.

Существует DLL уровня представления и DLL уровня доступа к данным. Я хочу, чтобы эти библиотеки DLL использовали набор строк подключения.

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

Другой вопрос заключается в том, должен ли я написать вспомогательный класс для чтения данных из внешнего файла конфигурации или мне следует использовать встроенные методы .Net?

Спасибо


person Community    schedule 01.06.2010    source источник
comment
Вы можете заставить свою dll читать значение файла конфигурации youtube.com/watch?v=juBDM3fb- я0   -  person Nisarg Shah    schedule 07.01.2014


Ответы (3)


Выделите код доступа к файлу конфигурации в отдельный класс. Сделайте данные конфигурации (строки подключения и прочее) доступными через интерфейс этого класса. Пусть интерфейс живет в общей сборке. Пусть любой класс, которому нужен этот интерфейс, получит ссылку на экземпляр класса конфигурации через внедрение зависимости . Если вы еще не используете инфраструктуру внедрения зависимостей, я настоятельно рекомендую Autofac.

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

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

public interface IConfigurationService
{
    string ConnectionString {get;}
}

public class ConfigurationService : IConfigurationService
{
    string ConnectionString {get;}

    public ConfigurationService()
    {
        // load configuration
    }
}

Мой класс доступа к данным может использовать этот класс напрямую:

public class DataAccess
{
    private string _connectionString;

    public DataAccess()
    {
        var config = new ConfigurationService();
        _connectionString = config.ConnectionString;
    }
}

Проблема с этим подходом заключается в сопряжении. DataAccess теперь напрямую зависит от класса ConfigurationService. Любые тесты, которые мы пишем для DataAccess, будут непреднамеренно затронуты классом ConfigurationService. Кроме того, если нам потребуется отключить реализацию ConfigurationService, это потребует изменений в DataAccess (и во всех других классах, напрямую зависящих от этого класса).

Чтобы решить эту проблему, мы инвертируем иерархию зависимостей и ссылаемся на интерфейс вместо конкретного класса, например:

public class DataAccess
{
    private string _connectionString;

    public DataAccess(IConfigurationService configurationService)
    {
        _connectionString = configurationService.ConnectionString;
    }
}

Класс доступа к данным теперь не обращает внимания на то, что представляет собой реализация службы конфигурации и как создается этот экземпляр.

person Peter Lillevold    schedule 01.06.2010
comment
Привет! Спасибо за ответ. Я согласен хранить код, связанный с конфигурацией, в отдельной DLL внутри класса. Я знаком с интерфейсами, но я не совсем уверен, что вы имеете в виду, говоря, что данные конфигурации доступны через интерфейс. Почему вы рекомендуете инъекцию зависимостей? Разве я не могу просто ссылаться на свой уровень данных конфигурации в каждом классе? например Использование утилит конфигурации; В остальном все понятно, спасибо большое! :) - person ; 02.06.2010
comment
Отличный пример, я думал об этом раньше, что если один из конкретных классов изменится, мне придется внести изменения в нескольких местах! Большое спасибо! - person ; 04.06.2010

Насколько мне известно, файлы DLL не могут использовать элементы конфигурации .net, такие как файлы app.config, поэтому, если вы хотите, чтобы ваша dll настраивалась, скажем, через файл xml, вам придется написать ее самостоятельно.

person AndrewC    schedule 01.06.2010
comment
Эй, так должен ли я ссылаться на внешний файл .config в web.config или я должен просто написать отдельный слой, который будет напрямую читать внешний файл .config? - person ; 01.06.2010

Я могу сохранить строку подключения в machine.config, но еще раз не уверен во всех последствиях....

person Community    schedule 01.06.2010