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

這對我的作品。我希望它能幫助與我處於同一位置的其他人。