5

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

有什么更好的方法来处理这个问题或有什么好的研究信息来源的建议吗?

我们目前是怎么做的:

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

我们遇到的具体问题:

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

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

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

3 回答 3

2

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

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

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

于 2010-04-02T23:37:16.720 回答
0

如果使用所述配置项的代码是您管理/可以更改的代码(并且所有代码都在托管代码空间/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)
    {
        ...
    }
}
于 2010-03-23T15:32:48.363 回答
0

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

于 2010-03-23T21:24:06.537 回答