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