静态类几乎总是被皱着眉头,还是曾经有过使用它们的好时机?
例如,在您的应用程序中实现无处不在的东西(例如在静态类中的安全性)是否有意义?您仍然可以在静态类上使用属性注入(inject)来更改实现,并且,如果要使用MEF之类的东西来注入(inject)实现,那么我认为它不会妨碍测试。
最佳答案
我主要将静态类用于无状态的帮助程序类,并在要创建扩展方法时使用。我尝试避免使用具有状态的静态类,因为正如您提到的那样,它可能会妨碍测试。
假设您决定将状态添加到静态类。要测试依赖于其状态的此类方法,您将必须找到一种在测试期间更改此状态的方法。这意味着您必须:
这意味着该类将需要提供一种方法(通过内部方法或内部属性 setter )来更改其状态,这可能是危险的。如果要创建不可变的类或完全封装其实现详细信息的类,则将无法轻松测试它们(如果根本不测试),并且测试可能会因更改实现而中断。即使使用MEF,也很难做到这一点。
当然,静态类有时会为诸如日志记录之类的问题以及安全性问题提供有吸引力的解决方案。在这些情况下,我将使用
static class
,它将所有调用委派给private readonly
字段。这样,可以正常地对该字段的类别进行单元测试。然后,您可以在集成测试中测试静态类。顺便看看.NET的design guidelines for static classes。它不包含与您的问题相关的任何内容,但包含有值(value)的建议。
关于mvvm - 依赖注入(inject)以及何时使用静态类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14594582/