当前位置 : 主页 > 网络编程 > ASP >

如果ASP.NET应用程序使用许多DLL,那么保持每个dll的配置分离的最佳方法是什么?

来源:互联网 收集:自由互联 发布时间:2021-06-24
为每个dll创建设置后,将生成.dll.config文件.如果该dll是asp.net应用程序的一部分,如何为每个dll分别保持这些配置,并且不将它们合并到web.config中? 例: 我有一个GMailSender类库(DLL),它通过
为每个dll创建设置后,将生成.dll.config文件.如果该dll是asp.net应用程序的一部分,如何为每个dll分别保持这些配置,并且不将它们合并到web.config中?

例:
我有一个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”]一样访问这些设置.

希望这可以帮助.

网友评论