依赖注入以及何时使用静态类

时间:2013-01-30 00:20:50

标签: mvvm dependency-injection mef

静态类几乎总是不受欢迎,或者是否有时间使用它们?

例如,在您的应用程序中实现无处不在的内容(如静态类中的安全性)是否有意义?您仍然可以在静态类上使用属性注入来更改实现,如果您使用类似MEF的东西来注入实现,那么我认为它不会妨碍您的测试。

1 个答案:

答案 0 :(得分:0)

我主要为无状态辅助类使用静态类,当我想创建扩展方法时。我试图避免使用具有状态的静态类,因为正如你所提到的那样,它会妨碍测试。

我们假设您决定将状态添加到静态类。要测试依赖于其状态的此类的方法,您必须找到在测试期间更改此状态的方法。这意味着您必须:

  1. 在每次测试前准备好状态。
  2. 每次测试后清除状态。
  3. 这意味着该类需要提供一种方法(通过内部方法或内部属性设置器)来改变其状态,这可能是危险的。如果您想创建完全封装其实现细节的不可变类或类,那么您将无法轻松地测试它们(如果不是),并且您的测试可能会更改为实现的更改。即使使用MEF,这也不容易。

    当然,静态类有时会为日志记录等问题提供有吸引力的解决方案,如您的问题所述,安全性。在这些情况下,我会选择static class将所有来电委托给private readonly字段。这样,该字段的类可以正常进行单元测试。然后,您可以在集成测试中测试静态类。

    顺便看看.NET design guidelines for static classes。它不包含与您的问题相关的任何内容,但它包含有价值的建议。