如何改进我们的CM.AppSettings参考

时间:2010-03-03 17:09:22

标签: asp.net refactoring application-settings configuration-management

ASP.NET 3.5

我们的解决方案中的类引用了ConfigurationManater.AppSettings [“”]来获取appSettings(来自web.config)。

我们决定对此并不满意。人们在代码中错误地键入appSetting键名称(编译得很好),跟踪用法很麻烦。然后,当您在整个地方引用相同的appSettings时,整个代码库中都存在重复的字符串。

因此,我们决定只允许一个类引用ConfigurationManager,其余的解决方案在需要某个appSetting的值时引用该类。 ConfigurationManater.AppSettings [“”]是静态的,所以我们从单个Settings类中暴露了一堆静态只读属性。

public class Settings {
    public static string Foo {
        get {
            return ConfigurationManager.AppSettings["Foo"];
        }
    }
}

这非常有效,直到我们需要在测试中模拟设置。我们创建了一个界面来启用我们的模拟(这是一种错误吗?)。

public interface ISettings {
    string Foo {
        get;
        set;
    }

}

public class Settings : ISettings {
    public string Foo {
        get {
            return ConfigurationManager.AppSettings["Foo"];
        }
    }
}

现在我们将ISettings实例注入为使用设置值的对象的依赖项(类/接口位于每个人都可以毫无问题地引用的项目中)。

在我们无法注入现有实例的地方(例如Global.asax),我们在静态字段中构造一个新实例。

鉴于所有这些,你建议我们改变什么,为什么?

1 个答案:

答案 0 :(得分:0)

使用界面来表示配置是一个好主意。但是你的实现看起来有些偏差。

Joshua Flanagan写道,编写应用程序配置代码的方式可以将特定的配置部分注入到代码中。这是一个好主意,因为它真正解耦了您的代码,而不必担心配置背后的细节。 Have a read

我认为这将解决您遇到的问题。可测试性。