对Properties.Settings.Default使用依赖注入?

时间:2011-08-19 17:50:18

标签: c# winforms dependency-injection settings

您是否应该考虑在类中使用Properties.Settings.Default作为依赖项,并因此将其注入?

e.g:

public class Foo
{
    private _settings;
    private bool _myBool;

    public Foo(Settings settings)
    {
        this._settings = settings;
        this._myBool = this._settings.MyBool;
    }
}


或者您是否会考虑将Settings用作全球应用程序作为良好做法?

e.g:

public class Foo
{
    private bool _myBool;

    public Foo()
    {
        this._myBool = Properties.Settings.Default.MyBool;
    }
}

3 个答案:

答案 0 :(得分:4)

我会选择“以上都不是”并直接注入布尔值:

public class Foo
{
    private readonly bool _myBool;

    public Foo(bool myBool)
    {
        _myBool = myBool;
    }
}

这使Foo与任何支持检索布尔值的基础结构的知识分离。 Foo没有理由通过依赖设置对象来引入复杂性,特别是如果它包含其他不相关的值。

答案 1 :(得分:2)

它们应该作为依赖项传递。想象一下当您想要在示例#2中通过单元测试更改该组设置时的情况 - 您必须在静态属性getter中使用某种复杂的开关逻辑来容纳它。

许多IoC容器甚至可以在注入类似的类时提供单例实现来帮助您。

答案 2 :(得分:2)

您可能希望将“设置”封装在类中并为其设置接口。这样,您的设置来自哪里可以更改单元测试等内容。如果您还使用IoC容器,则务必使用容器注册设置。

我为ConfigurationManagerWebConfigurationManager执行此操作,以便我可以为测试注入设置。 Nathan Gloyn has wrapped the adapters and interface up already in a project如果你也想这样做,你可以使用。{/ p>