Castle Windsor / ActiveRecord / NHibernate:如何 intercept/modify 连接字符串
Castle Windsor / ActiveRecord / NHibernate: How to intercept/modify connection string
我已经整合了我拥有的许多 C# .NET 解决方案的连接字符串信息。以前,每个项目都以自己的格式存储其连接字符串,需要我为每次安装软件修改几个文件。
只剩下一个解决方案给我带来了麻烦。这个特定的解决方案使用 Castle Windsor 2.0、ActiveRecord 2.0 和 NHibernate 2.1。该代码从 XML 文件中读取其配置。我希望从配置文件中删除连接字符串并在代码中以编程方式设置它。
以下是启动 Windsor 的相关代码部分:
windsorContainer = new WindsorContainer(new XmlInterpreter(xmlFileName));
windsorContainer.Resolve<IWindsorConfigurator>().Configure(windsorContainer);
logger = windsorContainer.Resolve<ILogger>();
以下是 XML 文件的内容:
<?xml version="1.0"?>
<configuration>
<properties>
<connectionString>Server=*****;Database=*****;User Id=*****;Password=*****</connectionString>
</properties>
<facilities>
<facility id="logging" type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" loggingApi="log4net" configFile="Configs/log4net.config" />
<facility id="atm" type="Castle.Facilities.AutomaticTransactionManagement.TransactionFacility, Castle.Facilities.AutomaticTransactionManagement" />
<facility id="arfacility" type="Castle.Facilities.ActiveRecordIntegration.ActiveRecordFacility, Castle.Facilities.ActiveRecordIntegration" isDebug="false" isWeb="false">
<!-- Configure the namespaces for the models using Active Record Integration -->
<assemblies>
<item>ChronoSteril.Application</item>
</assemblies>
<config>
<add key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="dialect" value="NHibernate.Dialect.MsSql2005Dialect" />
<add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="connection.connection_string" value="#{connectionString}" />
<add key="hibernate.cache.provider_class" value="NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache" />
<add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
<add key="hibernate.expiration" value="60" />
</config>
</facility>
</facilities>
<components>
<component id="windsorConfigurator" service="ChronoSteril.Application.IWindsorConfigurator, ChronoSteril.Application" type="ChronoSteril.WinApp.ClarionIntegrationWindsorConfigurator, ChronoSteril.WinApp" />
</components>
我对温莎不熟悉。在我的 Google 之旅中,我确实看到了一些以编程方式添加设施的代码,但这些示例对我的 Windsor 版本无效(我假设)。
问题: 谁能指导我从 XML 文件中删除连接字符串信息并允许我在代码中设置它?
谢谢!
我设法实现了我的意图。这并不理想,但在重写代码库之前会一直有效。 (我迫不及待地想放弃现有代码,就像做噩梦一样。)
帕特里克的评论,在我最初的问题下,让我改进了我的搜索标准,这产生了位于 here.
的线程
我的 XML 文件保持不变,除了我使用虚假值作为连接字符串信息。我永远不需要修改这些,它们不会泄露任何有效的连接信息。这是我的意图。我仍然没有发现如何从 XML 文件中成功删除 ActiveRecord 配置并使用代码进行配置。
我现在调用一个包含以下代码的方法:
ISessionFactoryHolder sessionFactoryHolder = ActiveRecordMediator.GetSessionFactoryHolder();
NHibernate.Cfg.Configuration configuration = sessionFactoryHolder.GetConfiguration(typeof(ActiveRecordBase));
connectionString = ReadConnectionString();
configuration.SetProperty("connection.connection_string", connectionString);
这对我有用。我希望它也可以帮助其他与我处于相同位置的人。
我已经整合了我拥有的许多 C# .NET 解决方案的连接字符串信息。以前,每个项目都以自己的格式存储其连接字符串,需要我为每次安装软件修改几个文件。
只剩下一个解决方案给我带来了麻烦。这个特定的解决方案使用 Castle Windsor 2.0、ActiveRecord 2.0 和 NHibernate 2.1。该代码从 XML 文件中读取其配置。我希望从配置文件中删除连接字符串并在代码中以编程方式设置它。
以下是启动 Windsor 的相关代码部分:
windsorContainer = new WindsorContainer(new XmlInterpreter(xmlFileName));
windsorContainer.Resolve<IWindsorConfigurator>().Configure(windsorContainer);
logger = windsorContainer.Resolve<ILogger>();
以下是 XML 文件的内容:
<?xml version="1.0"?>
<configuration>
<properties>
<connectionString>Server=*****;Database=*****;User Id=*****;Password=*****</connectionString>
</properties>
<facilities>
<facility id="logging" type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" loggingApi="log4net" configFile="Configs/log4net.config" />
<facility id="atm" type="Castle.Facilities.AutomaticTransactionManagement.TransactionFacility, Castle.Facilities.AutomaticTransactionManagement" />
<facility id="arfacility" type="Castle.Facilities.ActiveRecordIntegration.ActiveRecordFacility, Castle.Facilities.ActiveRecordIntegration" isDebug="false" isWeb="false">
<!-- Configure the namespaces for the models using Active Record Integration -->
<assemblies>
<item>ChronoSteril.Application</item>
</assemblies>
<config>
<add key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="dialect" value="NHibernate.Dialect.MsSql2005Dialect" />
<add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="connection.connection_string" value="#{connectionString}" />
<add key="hibernate.cache.provider_class" value="NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache" />
<add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
<add key="hibernate.expiration" value="60" />
</config>
</facility>
</facilities>
<components>
<component id="windsorConfigurator" service="ChronoSteril.Application.IWindsorConfigurator, ChronoSteril.Application" type="ChronoSteril.WinApp.ClarionIntegrationWindsorConfigurator, ChronoSteril.WinApp" />
</components>
我对温莎不熟悉。在我的 Google 之旅中,我确实看到了一些以编程方式添加设施的代码,但这些示例对我的 Windsor 版本无效(我假设)。
问题: 谁能指导我从 XML 文件中删除连接字符串信息并允许我在代码中设置它?
谢谢!
我设法实现了我的意图。这并不理想,但在重写代码库之前会一直有效。 (我迫不及待地想放弃现有代码,就像做噩梦一样。)
帕特里克的评论,在我最初的问题下,让我改进了我的搜索标准,这产生了位于 here.
的线程我的 XML 文件保持不变,除了我使用虚假值作为连接字符串信息。我永远不需要修改这些,它们不会泄露任何有效的连接信息。这是我的意图。我仍然没有发现如何从 XML 文件中成功删除 ActiveRecord 配置并使用代码进行配置。
我现在调用一个包含以下代码的方法:
ISessionFactoryHolder sessionFactoryHolder = ActiveRecordMediator.GetSessionFactoryHolder();
NHibernate.Cfg.Configuration configuration = sessionFactoryHolder.GetConfiguration(typeof(ActiveRecordBase));
connectionString = ReadConnectionString();
configuration.SetProperty("connection.connection_string", connectionString);
这对我有用。我希望它也可以帮助其他与我处于相同位置的人。