我们正在使用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
部分。
具有讽刺意味的是,如果我使用立即/观察窗口并检查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>
部分已被删除)。
我在这里缺少什么!这不是那么难!
答案 0 :(得分:1)
在周末考虑这个问题并进行更多挖掘之后,我找到了一个帮助我解决问题的Blog Post。这就是它对我有用的方式:
var builder = new ConfigurationSourceBuilder();
// Configure the dataSource (connection string)
builder.ConfigureData()
.ForDatabaseNamed( "TestDB" )
.ThatIs.ASqlDatabase()
// this would be determined at runtime; not statically defined
.WithConnectionString( @"Data Source=.\SQLExpress;Initial Catalog=Logging;Integrated Security=True" )
.AsDefault();
// create a new config source
var configSource = new DictionaryConfigurationSource();
builder.UpdateConfigurationWithReplace( configSource );
IUnityContainer container = new UnityContainer();
// load the default configuration information from the config file
// i.e. ConfigurationSourceFactory.Create()
// and add it to the container
container.AddNewExtension<EnterpriseLibraryCoreExtension>();
// create a configurator to use to configure our fluent configuration
var configurator = new UnityContainerConfigurator( container );
EnterpriseLibraryContainer.ConfigureContainer( configurator, configSource );
// Use the configured container with file and fluent config as the Enterprise Library service locator
EnterpriseLibraryContainer.Current = new UnityServiceLocator( container );
// Write a log entry using the Logger facade
LogEntry logEntry = new LogEntry
{
EventId = 180,
Priority = 1,
Message = "Message",
Categories = { "AccessAudit" }
};
Logger.Write( logEntry );
希望将来可以帮助其他人。