«Конструктор» был волшебным словом.Это может не помочь в вашем случае, так как вы нашли решение, но это может быть полезно для других в той же ситуации.
Если вы вводите объект System.Configuration.Configuration
в класс, у вас нетполагаться на статические свойства ConfigurationManager
.
public class LibraryClass
{
private Configuration _configuration;
public LibraryClass(Configuration configuration)
{
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
}
public void FunctionUnderTest()
{
string connectionString = _configuration.ConnectionStrings.ConnectionStrings["cnnName"].ConnectionString;
// Connect to the database as you normally would.
}
}
В консольном / графическом приложении и модульных тестах загрузите его так, чтобы использовать {что-нибудь} .config:
Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
// Register 'configuration' as a singleton using the container of your choice.
В веб-приложении загрузите его следующим образом, чтобы использовать web.config:
Configuration configuration = WebConfigurationManager.OpenWebConfiguration("~/Web.config");
// Register 'configuration' as a singleton using the container of your choice.
Чтобы использовать его в C # Interactive, загрузите его с помощью первого метода и предоставьте зависимость классу напрямую:
#r "System.Configuration"
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(
new ExeconfigurationFileMap() { ExeConfigFilename = @"path\to\Arbitrary.config" },
ConfigurationUserLevel.None);
var lib = new LibraryClass(configuration);
lib.FunctionUnderTest();
Обратите внимание, что свойства раздела имеют дополнительный уровень по сравнению с тем, что вы обычно ожидаете.Я думаю, что это как-то связано с тем, как статические свойства ConfigurationManager
работают с экземпляром Configuration
.