1

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),我们在静态字段中构造一个新实例。

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

4

1 回答 1

0

使用接口来表示配置是一个好主意。但是你的实现看起来有点不对劲。

Joshua Flanagan 写了一篇关于编写应用程序配置代码的文章,可以将特定的配置部分注入到您的代码中。这是一个好主意,因为它确实使您的代码不必担心配置背后的细节。读一读

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

于 2010-03-05T16:52:21.830 回答