Код конструктора DataProvider имеет дело с конфигурацией, поэтому он может генерировать исключения.И конструкторы с исключительными исключениями не рекомендуются.
Почему они "не рекомендуются"?Посмотрите на библиотеки базовых классов Microsoft, и вы увидите, что достаточно близко каждый отдельный конструктор проверяет переданные ему аргументы и выдает исключение некоторого аргумента, если аргумент недопустим.Почему вы позволяете кому-либо создавать экземпляр объекта в недопустимом состоянии, не сказав им об этом?Неудачный ранний, неудачный жесткий.
Конструктор, генерирующий исключение, является гораздо лучшим API для программирования, чем использование отдельного метода инициализации (лично я ненавижу двухфазную инициализацию; второй вызов так легко забыть).Если нет веской причины избегать этого, я бы просто сделал проверки в конструкторе.
Если вы действительно хотите использовать статический метод фабрики (ничего плохого в этом нет, если вам не нужно сделать его слабо связанным),убедитесь, что конструктор по умолчанию является закрытым, поэтому пользователи вынуждены использовать соответствующий метод фабрики.