【问题标题】:Use dependency injection for Properties.Settings.Default?对 Properties.Settings.Default 使用依赖注入?
【发布时间】:2011-10-30 19:49:27
【问题描述】:

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

例如:

public class Foo
{
    private _settings;
    private bool _myBool;

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

.
.

或者您是否认为将Settings 用作应用程序范围的全球性良好做法?

例如:

public class Foo
{
    private bool _myBool;

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

【问题讨论】:

    标签: c# winforms dependency-injection settings


    【解决方案1】:

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

    public class Foo
    {
        private readonly bool _myBool;
    
        public Foo(bool myBool)
        {
            _myBool = myBool;
        }
    }
    

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

    【讨论】:

    • +1,但请注意,使用 DI 容器进行配置要困难得多。不过,这仍然可能是最好的主意。
    • @Domenic:绝对值得注意的是,某些 DI 容器可能不像其他容器那样容易实现这一点。我使用 Autofac,它支持 lambda 表达式进行注册,因此可以轻松注入原始值。
    • @Bryan:我同意,但是出于问题的目的,我上面的代码 sn-ps 被设计为一个过于简单的示例。不过,你说的是对的,谢谢你的回答。
    【解决方案2】:

    您可能希望将设置封装在一个类中并为它们提供一个接口。这样,您的设置的来源可以更改为单元测试之类的东西。如果您还使用 IoC 容器,那么一定要向容器注册设置。

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

    【讨论】:

    • 我喜欢接口的想法,但我不知道如何去实现它。你的意思是有一个接口,它的属性直接映射到设置中的属性,或者使用 ConfigurationManager,就像你链接到的代码一样?之前没有使用过 ConfigurationManager,所以不太清楚在这里做什么。朝着正确方向的另一个轻推将不胜感激。 :)
    • IConfigurationManager 只是应用程序中可能存在外部设置的一个示例,您希望它们由容器处理并注入到类中。对于您的Settings 类,我倾向于创建一个与Settings 的公共成员最匹配的ISettings 接口;因此,如果您在 Settings 上有一个 ConnectionString 属性,则将其设为接口上的属性,等等。
    • 感谢您的澄清,这是有道理的。
    【解决方案3】:

    它们应该作为依赖项传入。想象一下当您想通过示例#2 中的单元测试更改该组设置时的场景 - 您必须在静态属性 getter 中有某种复杂的切换逻辑来适应它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      相关资源
      最近更新 更多