【问题标题】:How do I manage application configuration in ASP.NET?如何在 ASP.NET 中管理应用程序配置?
【发布时间】:2010-03-23 14:08:26
【问题描述】:

我在管理要为不同客户端部署的 ASP.Net 应用程序的配置时遇到了困难。大量不同的设置需要摆弄占用大量的时间,而当前的配置方法过于复杂,我们无法将这项责任推给支持合作伙伴。

对于处理此问题的更好方法或研究的良好信息来源有什么建议吗?

我们目前是怎么做的:

  • Web.Config 中引用的各种 xml 配置文件,例如 AppSettings.xml。
  • 特定站点的配置保存在重复的配置文件中。
  • 包含网站特定数据列表的文本文件
  • 在某些情况下,手动一次性更改数据库
  • Windsor IOC 的 C# 配置。

我们遇到的具体问题:

  • 启用了不同功能的不同站点、我们必须与之交谈的不同外部服务以及不同的业务规则。
  • 不同的部署类型(实时、测试、培训)
  • 配置键随版本变化(添加、删除),这意味着我们必须更新所有重复的文件
  • 我们仍然需要能够在应用程序运行时更改密钥

我们目前对如何解决此问题的想法是:

  • 将配置移动到动态编译的代码(可能是 Boo、Binsor 或 JavaScript)中
  • 具有某种形式的差异/合并配置:将默认配置与实时/测试/培训配置和特定于站点的配置相结合

【问题讨论】:

  • 最后我选择了一个合并配置系统。配置文件存储在树中。加载密钥时,它首先查找最具体的版本(站点和部署类型),然后依次查找更通用的文件,直到找到密钥。我从这一切中学到的主要一点是,拥有您必须在源代码管理中管理的所有配置非常有帮助。

标签: c# .net configuration castle-windsor boo


【解决方案1】:

无论您采用哪种方式,我认为为您的配置提供单一“真实来源”的概念可能很有价值。

如果您需要以自己的特殊形式为某些组件提供配置,则可以复制。

但是,为了保持理智,我认为您应该尝试在一个地方设置与应用程序相关的所有配置,然后使用定义明确的机制将其转换为 Web.config 中的条目,以及任何其他你必须支持的配置机制。

根据您的支持合作伙伴的技能水平(他们是否会破坏 XML),我想您可能还想提供一个 GUI 实用程序让他们旋转这个“真实来源”配置文件中的所有旋钮,“应用”并运行转换/更新代码以对 Web.config 和朋友进行必要的更改。

然后,为了管理不同站点/客户的配置,理论上您大约需要管理一个配置文件。

注意:在 ASP.NET 4.0 中将提供构建时配置转换机制(请参阅http://blog.hmobius.com/post/2010/02/17/ASPNET-40-Part-4-Config-Transformation-Files.aspx),这可能会使这项任务变得更容易。看来您可以将其与非 Web 项目的一些技巧一起使用(请参阅http://philbolduc.blogspot.com/2010/03/using-config-transforms-outside-web.html)。

但是,如果您需要在部署时进行这些更改,您可能会受困于编写自定义工具来执行此操作,但看起来 XDT 转换可能是您的最佳选择,因为您希望能够添加/更新/删除项目。

【讨论】:

  • 8 年后回顾我的旧 StackOverflow 问题,我发现这个建议是多么明智。
【解决方案2】:

如果使用所述配置项的代码是您管理/可以更改的代码(并且所有代码都在托管代码空间/C# 中运行),我希望将获取设置的方法调用移植到一个类似单例的类中至少有一个 GetString() 方法。

GetObject() 可能非常有用(查看 .Net XML 序列化的东西 - 美国人用 'z' 拼写它:序列化)......对很多东西都很有用,但也因为它意味着你可以开始打包相关配置项到商店中的单个条目中。

关于使用单个存储(具有缓存访问权限的数据库表)或仅使用新的配置外观来封装配置项的存储位置 - 这取决于您......我强烈希望每个产品部署一个存储配置,因为这样您就始终知道在哪里查看以及在哪里进行更改。所有 Web 服务引用(WCF 或其他)都可以使用运行时提供的字符串来构造和调用... :)

在缓存键值方面 - 我使用自己的内存缓存(用于较小的应用程序),因为堆栈上的开销是可管理的......像 memcache 这样的东西可能在这里工作(配置存储通过 TCP/在网络某处)...

编辑 比如:

public class ConfigurationStore
{
    private static ConfigurationStore _instance = null;

    public static ConfigurationStore Instance {
        get {
        if(_instance == null)
        {
            _instance = new ConfigurationStore();
        }

        return _instance;
        }
    }

    public string GetValue(string key)
    {
        ....
    }

    public Object GetObject(string key)
    {
        ...
    }
}

【讨论】:

    【解决方案3】:

    您可以考虑查看 NAnt 脚本以实现自动化,并结合一些自定义 .net 实用程序来操作配置键。

    【讨论】:

      猜你喜欢
      • 2012-12-10
      • 2011-03-07
      • 2011-09-07
      • 2018-05-14
      • 2013-01-18
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 2012-07-05
      相关资源
      最近更新 更多