Мы используем Enterprise Library 5.0 и хотели бы использовать блок приложения Logging для записи сообщений журнала/трассировки в базу данных. Выполнение всей конфигурации в файле web.config
работает как чемпион.
Однако при запуске приложения нам необходимо указать строку подключения к базе данных, которую регистратор использует динамически. Мы подумали, что сможем применить гибридный подход, используя Ent Lib 5.0 Fluent API для программной регистрации строки подключения, а затем объединив ее со значениями конфигурации из файла web.config
. Это позволило бы нам перенастроить способ и место написания сообщений трассировки без изменения кода.
Вот что мы пробовали:
var dynamicConnectionString = "..." // value determined elsewhere
var builder = new ConfigurationSourceBuilder();
builder.ConfigureData()
.ForDatabaseNamed( "TestDB" ).ThatIs.ASqlDatabase()
.WithConnectionString( dynamicConnectionString );
var configSource = new SystemConfigurationSource();
// the line below throws an ArgumentException with the message
// 'Cannot add a ConfigurationSection with the same name that already exists'
builder.UpdateConfigurationWithReplace( configSource );
EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer( configSource );
В файле web.config
для нашего тестового проекта мы определяем только раздел loggingConfiguration
следующим образом:
<loggingConfiguration ...>
<listeners>
<add databaseInstanceName="TestDB" ... />
</listeners>
<formatters>...</formatters>
<categorySources>...</categorySources>
<specialSources>...</specialSources>
</loggingConfiguration>
Если я проверяю объект построителя в отладчике, он имеет только 1 определенный раздел: раздел connectionStrings
, который содержит одну запись connectionString
со значениями, которые я указал в коде. Файл web.config
не вообще содержит раздел connectionStrings
.
По иронии судьбы, если я использую Immediate/Watch Window и проверяю System.Configuration.ConfigurationManager.ConnectionStrings
, он сообщает, что уже определено 1 соединение... соединение по умолчанию ("data source=.\SQLExpress;Integrated Security=SSPI;AttacheDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
).
Если я добавлю <connectionStrings><clear /></connectionStrings>
для очистки унаследованных значений, при повторной отладке я все еще получаю то же исключение, что и раньше, и VS уведомляет меня об обновлении файла web.config
(если я перезагружу файл, раздел <connectionStrings>
был удален).
Чего мне здесь не хватает! Это не может быть так сложно!