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

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

目前我们是如何做事的:

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

我们遇到的具体问题:

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

我们目前关于如何解决这个问题的想法是:

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

解决方案

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

如果您需要以某些组件自己的专门形式为它们提供配置,那么重复是可以的。

但为了保持你的理智,我认为你应该尝试并致力于在一个地方设置与你的应用程序相关的所有配置,然后使用一个定义良好的机制将其转换为 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 转换可能是您的最佳选择,因为您希望能够添加/更新/删除项目。

其他提示

如果使用所述配置项的代码是您管理/可以更改的代码(并且全部在托管代码空间/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)
    {
        ...
    }
}

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top