0

我已经整理了我所拥有的许多C#.NET解决方案的连接字符串信息。以前,每个项目都以自己的格式存储连接字符串,要求我为每次软件安装修改多个文件。Castle Windsor/ActiveRecord/NHibernate:如何拦截/修改连接字符串

只剩下一个解决方案给我带来麻烦。这个特殊的解决方案使用Castle Windsor 2.0,ActiveRecord 2.0和NHibernate 2.1。该代码从XML文件读取其配置。我希望从配置文件中删除连接字符串,并在代码中以编程方式进行设置。

这里是代码的相关章节发起温莎:

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文件中删除连接字符串信息,并允许我在代码中设置它?

谢谢!

+0

[This SO question](http://stackoverflow.com/questions/4456652/programmatically-configure-activerecordfacility-for-multiple-databases)包含了一篇关于使用'InPlaceConfigurationSource'以编程方式初始化ActiveRecord Facility的文章的链接。它可能适用于你正在做的事情: – PatrickSteele

+0

谢谢你的评论。虽然您的链接及其包含的链接直接解决了我的问题,但确实帮助我优化了搜索条件,并找到了解决问题的解决方案。我在下面展示它。 –

回答

0

我设法达到了我的目的。这并不理想,但会在代码库被重写之前起作用。 (我迫不及待地滴像一个噩梦现有的代码。

帕特里克的评论,在我最初的问题,让我来改进搜索标准,取得了位于here线程。

我的XML文件保持不变,除了我使用连接字符串信息伪造值。我将永远不需要修改这些内容,也不会显示任何有效的连接信息。这是我的意图。我还没有发现如何成功地从XML文件中删除ActiveRecord配置并使用代码进行配置。

我现在请包含下面的代码的方法:

ISessionFactoryHolder sessionFactoryHolder = ActiveRecordMediator.GetSessionFactoryHolder(); 
NHibernate.Cfg.Configuration configuration = sessionFactoryHolder.GetConfiguration(typeof(ActiveRecordBase)); 
connectionString = ReadConnectionString(); 
configuration.SetProperty("connection.connection_string", connectionString); 

这对我的作品。我希望它能帮助与我处于同一位置的其他人。