【问题标题】:Injecting a dependency that is a static variable in a class在类中注入作为静态变量的依赖项
【发布时间】:2020-12-16 22:24:17
【问题描述】:

WinForms 应用程序使用以下“配置类”(部分代码):

public class Configuration
{
    public static Project currentProject;
}

应用程序中的许多其他类当前使用这个Project 变量,例如:

public class Controller
{
    public void processSomething()
    {
        Configuration.currentProject.doSomething();
    }
}

出于松耦合的目的,我希望能够注入一个Project 变量作为依赖项。问题是,Configuration.currentProject 值可能会在运行时发生变化。应该如何处理?引用传递可以解决吗?

【问题讨论】:

  • 这是一个 WinForms 应用程序。
  • public static Project currentProject; 是否可以将其设置为 not 静态?
  • @mjwills 可能不会,但我会调查一下。现在让我们假设它必须是静态的。
  • 如果在 IoC 中将其设为单例对象,则不必将其设为静态。
  • 你使用什么 IoC 容器?

标签: c# dependency-injection static-classes


【解决方案1】:

我建议传入Func<IProject>Func<Project>。这将允许您很好地处理对Configuration.currentProject 的更改(因为调用该函数将始终看到static 的当前值)并且还允许相对容易地编写单元测试。

话虽如此,我强烈建议您不要使用 static 和手动依赖注入。如果您使用 IoC 容器(例如 Autofac),则可能会内置 Func 和单例支持(没有 static)。

【讨论】:

  • 如何让Func<IProject> 操作Configuration 类中的静态变量?据我了解,Func 需要指向某个返回值的方法。
  • 它可以在传递的Project 实例中设置您想要的任何属性等。无论哪种方式,这现在都是一个新问题(即,您在最初的问题中从未说过您需要它 - 您说它可能会改变,但不清楚接受依赖的类是改变它的那个)。所以你最好为@Al2110写一个新问题。
  • 另一种选择是采用两个依赖项——第二个是IProjectSetter,它有一个设置Configuration.currentProject的方法。因此,大多数消费者依赖于Func,但如果还需要设置特定的代码路径,那么它需要第二个依赖(IProjectSetter)。
猜你喜欢
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
相关资源
最近更新 更多