例:
我有一个GMailSender类库(DLL),它通过GMail服务器发送电子邮件.您只需要一个GMailSender实例,如下所示:
GMailSender gms = new GMailSender(); gms.To = "myfriend@yahoo.com"; gms.Subject = "System.Configuration dilemma"; gms.Body = "Can anyone help me with this question ?"; gms.Send();
考虑GMailSender在GMailSender.dll中,它的配置文件是GMailSender.dll.config,其中包含GMail帐户的用户名和密码.
我希望这个DLL使用自身的配置文件(在同一目录中的dll和config,即在ASP.NET应用程序的Bin文件夹中)或桌面应用程序旁边.通过这种方式,GMailSender独立于谁正在使用他来检索它的配置(当前已加载此DLL的AppDomain).
我想要这个而不重建轮子(没有自定义配置类).我猜它可能与System.Configuration,但这个命名空间可能是最糟糕的.NET设计!
请不要告诉你为什么设计这样……
这是一个基于插件的设计,最后MEF现在在.NET 4.0中做了某种,但是部件配置存在同样的问题.至少MEF我不再需要争论基于插件的设计优势了.
您可以使用自定义配置部分实现所需.此 MSDN article提供了有关如何实现此类配置节的一些详细信息和示例.如果您需要简单的键/值配置,例如appSettings部分,那么创建自定义配置部分非常简单.
您需要做的第一件事是在web.config中定义您的配置部分:
<configSections> <section name="GmailSettings" restartOnExternalChanges="true" type="System.Configuration.NameValueFileSectionHandler" /> </configSections>
现在,在web.config文件中,您可以声明GmailSettings部分并设置您将用于该设置的外部配置文件的位置:
<GmailSettings configSource="GmailSettings.config"></GmailSettings>
configSource指定用于定义GmailSettings部分的外部配置文件的名称和位置.请注意定义节时使用的restartOnExternalChanges属性.如果您希望在修改GmailSettings.config文件时自动重新启动应用程序(就像修改web.config文件时那样),请将其设置为true.
以下是如何实施GmailSettings.config文件的示例:
<?xml version="1.0"?> <GmailSettings> <add key="userName" value="blabla"/> <add key="password" value="moreBla"/> </GmailSettings>
您可以使用ConfigurationManager.GetSection()方法或通过实现如下所示的帮助程序类来访问GmailSettings中的设置:
public class GmailSettings { private static readonly GmailSettings _instance = new GmailSettings(); private NameValueCollection _settings = ConfigurationManager.GetSection("GmailSettings") as NameValueCollection; public static GmailSettings Instance { get { return _instance; } } public string this[string key] { get { return _settings[key]; } } }
现在可以像GmailSettings.Instance [“userName”]一样访问这些设置.
希望这可以帮助.