zhaowd2001@yahoo.com

博客园 首页 新随笔 联系 订阅 管理

标题:改变 Configuration File为其他配置文件
版本:Enterprise Library June 2005

问题:我知道 ConfigurationManager 缺省使用的配置文件是应用程序配置文件。假设我做了个dll,名字是BookingUIP.dll,它使用ConfigurationManager和Tracer(Logging Block内的对象)来读取参数和记录跟踪信息。如果我做一个WindowsFormsUI.exe来调用BookingUIP.dll,那么BookingUIP.dll缺省会读取WindowsFormsUI.exe.config配置文件。由于WindowsFormsUI.exe.config是我控制的,这不会出现什么问题。

但是,当我用NUnit 的nunit-gui.exe来调用 BookingUIP.dll的时候,BookingUIP.dll缺省会使用nunit-gui.exe.config来作为自己的配置文件。

现在,我的问题时,如何使BookingUIP.dll引用的所有Application Block,都缺省读取 BookingUIP.dll.config,而不是nunit-gui.exe.config或者WindowsFormsUI.exe.config。

我找来找去,发现没有办法,只好在ConfigurationManager内增加个SetConfigurationFile函数,把BookingUIP.dll.config文件全路径传给它,并且修改ConfigurationManager的缺省构造函数,让它使用我传入的配置文件名。

当然,这肯定不是最好的办法,不知道各位高手有什么好办法?
***********************************相关代码*********************
**********************************
1.BookingUIP.dll
我的BookingUIP.dll是从 BookingUIP.cs生成的,代码很简单:

namespace BookingUIP 

    
public class BEClass1 
    

        
public  Microsoft.Practices.EnterpriseLibrary.Data.Database GetDatabase() 
        

            
return Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase(); 
        }
 
    }
 
}
 

当然,编译成BookingUIP.dll的时候要引用EntLlib的Common,Configuration,Data 3个dll.

2.BookingUIP.dll.config和dataconfiguration.config
然后使用EntLibConfig.exe生成BookingUIP.dll.config和dataconfiguration.config.

3.WinFormApp1.exe
再做一个简单的WinForm程序,来调用 BEClass1的 GetDatabase方法:
WinFormApp1.cs:        

    private void btnGetDatabase_Click(object sender, EventArgs e) 
        

            
string msg = null
            BookingUIP.BEClass1 be 
= new BookingUIP.BEClass1(); 
            Microsoft.Practices.EnterpriseLibrary.Data.Database db 
= null
            
// 
            msg = "Current Configuration File is " + Environment.NewLine + Environment.NewLine + 
                Microsoft.Practices.EnterpriseLibrary.Configuration.ConfigurationManager.GetCurrentContext().ConfigurationFile 
+ 
                Environment.NewLine; 
            MessageBox.Show(msg); 

            msg 
= null
            
try 
            

                db 
= be.GetDatabase(); 
                msg 
= "GetDatabase ok!"
                MessageBox.Show(msg); 
            }
 
            
catch (Exception ex) 
            

                msg 
= ex.Message; 
                MessageBox.Show(msg, 
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
            }
 
        }

 从WinFormApp1.cs生成WinFormApp1.exe,要引用EntLlib的Common,Configuration,Data 3个dll.

4.测试结果
4.1 如果 WinFormApp1.exe.config不存在,那么btnGetDatabase_Click会报告
---------------------------
Current Configuration File is C:\WINNT\Microsoft.NET\Framework\v2.0.50727\Config\machine.config
---------------------------

然后db = be.GetDatabase();失败:
---------------------------
Invalid section name. The section 'dataConfiguration' does not exist in the requested configuration file 'G:\..\WinFormApp1.exe.config' or the file 'C:\WINNT\Microsoft.NET\Framework\v2.0.50727\Config\machine.config'. Make sure that the 'enterpriseLibrary.configurationSections' configuration section exists in one of the files and that the section 'dataConfiguration' is defined.
---------------------------


4.2如果WinFormApp1.exe.config存在,但是没有dataConfiguration配置块,那么btnGetDatabase_Click会报告
---------------------------
Current Configuration File is G:\..\WinFormApp1.exe.config
---------------------------

然后db = be.GetDatabase();失败:
---------------------------
Invalid section name. The section 'dataConfiguration' does not exist in the requested configuration file 'G:\..\WinFormApp1.exe.config' or the file 'C:\WINNT\Microsoft.NET\Framework\v2.0.50727\Config\machine.config'. Make sure that the 'enterpriseLibrary.configurationSections' configuration section exists in one of the files and that the section 'dataConfiguration' is defined.
---------------------------

4.3如果WinFormApp1.exe.config存在,并且dataConfiguration配置正确,
那么db = be.GetDatabase();会成功。

在以上三种情况下,BookingUIP.dll.config和dataconfiguration.config始终存在,并且BookingUIP.dll.config正确连接到dataconfiguration.config.

我的问题是,如何能让 WinFormApp1.exe调用BookingUIP.dll的方法,同时BookingUIP.dll内面的Enterprise Library代码(包括Tracer)都引用BookingUIP.dll.config作为自己的配置文件,而不是WinAppForm1.exew.config?

posted on 2005-10-24 14:39  zhaowd2001@yahoo.com  阅读(1351)  评论(3)    收藏  举报