【问题标题】:Is having a global Config class a bad thing?拥有一个全局 Config 类是一件坏事吗?
【发布时间】:2011-03-06 03:23:05
【问题描述】:

目前在我正在构建的个人网站中,我正在使用全局静态 Config 类来保存我可能需要更改的半全局可配置的所有内容。所以现在它看起来像这样:

public static class Config
{
    public static string ConnectionString = "mongodb://localhost";
    //more configuration options..
    public static MongoDB.Driver.MongoDatabase GetDB(){
        MongoServer server = MongoServer.Create(Config.ConnectionString);
        MongoDatabase db = server.GetDatabase(Config.Database);
        return db;
    }
    public static Markdown GetMarkdown(){
        var options=new MarkdownOptions(){
            AutoHyperlink=true,
            AutoNewlines=false,
            EmptyElementSuffix=" />",
            LinkEmails=false,
            StrictBoldItalic=true
        };
        var m=new Markdown(options);
        return m;

    }
}

使用像这样的全局配置类是某种反模式吗?另外,我更喜欢我的连接字符串在 web.config 之外。我希望我的 web.config 尽可能小。

【问题讨论】:

    标签: c# asp.net design-patterns anti-patterns


    【解决方案1】:

    三个成员中只有一个是真正的配置,另外两个是实用的。

    如果需要更改这些配置,则在编译后的代码中进行配置确实很难维护,因为它需要重新构建,这确实是配置文件的原因。

    【讨论】:

    • 好吧,从技术上讲,GetMarkdown 有一些隐式配置。
    【解决方案2】:

    我做的事情与此类似,但不适用于连接字符串等设置。如果连接字符串需要更改,您需要更新并重建您的项目。如果您将连接字符串存储在 web.config 中,一个简单的更新允许您的应用立即使用新设置(无需重新编译)。

    【讨论】:

    • 好吧,就我而言,我的网站很小且构建速度很快,我重建/上传它的频率比更改连接字符串的频率高。想象一下其他的东西,比如 Markdown 配置。
    • 这是一种权衡。对我来说,我不明白为什么你不想要 web.config 中的连接字符串。我发现它工作得很好。如果无论出于何种原因,这对您不起作用,并且您了解将其硬编码为您的源代码的不利之处,那么这是您的选择。
    【解决方案3】:

    厄尔兹,

    关于你的第二个问题,你可以这样做,没有必要在 web.config 中拥有所有的连接或配置。您可以有一个单独的配置文件并将其指向 web.config 文件,如下所示

    <connectionStrings configSource="config\yourpath\connectionStrings.config"/>
    

    关于第一个问题,写一个获取值的通用方法。将所有值加载到常量文件并编写一个帮助类来获取这些值

    【讨论】:

      【解决方案4】:

      反模式是 GetMarkdownConnectionString 在同一个类中因为它们都是静态的,但它们实际上没有函数关系GetMarkdownGetDB看起来像工厂方法,它们可能应该在自己的类中。

      Single Responsibility Principle 表示您应该将可能出于相同原因而发生变化的事物组合在一起。您的数据库连接和 Markdown 配置不太可能同时或出于相同原因更改。

      【讨论】:

        【解决方案5】:

        我们将配置设置移至数据库。使从 Dev 到 QA 再到 Prod 的迁移变得更容易。 The blog entry is here.

        与此相关,我们将连接字符串放在 WebEnvironment.config 中。所以现在我们可以通过 web.config 更改来提升我们的代码,而不必担心连接字符串。 That blog post is here.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-26
          相关资源
          最近更新 更多