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);

这对我有用。我希望它也可以帮助其他与我处于相同位置的人。