Я бы предпочел внедрить любые необходимые объекты, используя инжектор конструктора (когда это возможно).
Одно небольшое преимущество, которое я вижу, - это прозрачность в отношении зависимостей класса.
Например, если вы пытаетесь создать экземпляр класса в тестовом жгуте (при выполнении интеграционного тестирования):
- в первом случае (инъекция в конструктор) вы сразу видите, что ему нужна строка подключения, и укажите одну
- во втором случае вы создаете экземпляр класса (возможно, с помощью конструктора по умолчанию) и после некоторой проб и ошибок обнаруживаете, что это зависит от установленного свойства
ConnectionString
Обновление:
Другое преимущество подхода с использованием конструктора заключается в том, что он отсоединяет сам класс от механизма получения строки соединения из app.config.
Это может включить в будущих сценариях, о которых вы даже не думаете прямо сейчас.
Например, в проекте, над которым я сейчас работаю, у меня есть компонент с доступом к базе данных, и я использовал его повторно в нескольких контекстах. В некоторых из них он использует стандартную строку подключения, полученную из файла конфигурации, в то время как в других у меня есть другой компонент, который решает, какую строку подключения использовать в зависимости от некоторых условий.
Если вы выберете второй подход, вам потребуется изменить код для поддержки такой функциональности.