В общем случае следует избегать глобального состояния, будь то глобальный класс или единичный объект.
Идеальным решением было бы заставить ваше приложение загрузить строку подключения из конфигурации и внедрить в любые классы, которые в ней нуждаются. В зависимости от размера вашего приложения может помочь IoC контейнер, такой как Unity или Castle Windsor , но, безусловно, не является обязательной частью решения.
Если это не вариант, и вы застряли в поддержании глобального состояния (из-за существующей кодовой базы или чего-то еще), я не знаю, есть ли огромная разница между двумя предложенными вами подходами.
Обновление: Просто чтобы прояснить, забудьте пока все о контейнерах IoC, «Inject» - это просто причудливый способ сказать «передать как параметр» (либо конструктору класса, либо через собственность или что-то еще).
Вместо того, чтобы иметь класс доступа к данным, нужно запросить строку подключения (из какого-то глобального или одиночного типа), передать ее через конструктор или свойство.
Обновление № 2: Я думаю, что все еще есть некоторое недопонимание относительно того, что влечет за собой этот подход.
В основном все сводится к тому, как выглядит ваш класс доступа к данным:
public class DataAccessClass
{
public DataAccessClass()
{
_connString = SomeStaticThing.GetConnectionString();
}
}
или
public class DataAccessClass
{
public DataAccessClass(string connString)
{
_connString = connString;
}
}
В этих статьях (и фактически во многих статьях этого блога) подробно описан ряд причин, по которым последний лучше первого (не в последнюю очередь потому, что первый почти невозможно провести модульное тестирование).
Да, в каком-то месте должен быть какой-то статичный парень, отвечающий за захват строки соединения, но дело в том, что ваши зависимости от статических методов ограничены этим spot (который, вероятно, будет вашим методом Main в процессе начальной загрузки вашего приложения), а не разбросан по всей вашей кодовой базе.