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