如何将静态类重构为使用依赖注入的类?

7

我继承了一些代码,其中有一个名为AuthenticationManager的类,它包含所有静态方法。

我正在引入DI(依赖注入)并希望添加一个构造函数,该构造函数需要一个依赖项UserController。

UserController _userController;

public AuthenticationManager(UserController userCont)
{
    _userController = userCont;
}

现在我遇到编译时错误,提示非静态变量从静态方法引用。您对于最小程度修改此类和调用代码的最佳实践建议是什么?

我们正在使用SimpleServiceLocator作为IOC容器。


是不是该升级到Simple Injector了?我已经停止开发Simple Service Locator了。 - Steven
谢谢你的提示 - 我不知道 Simple Injector 的存在!Simple Injector 是否提供了额外的功能来解决我的问题,还是说仅仅是个好东西? - Steve Ward
这并没有回答你的问题,但是Simple Injector 更快、更干净,并且在添加扩展方面有更好的支持(这里描述的大多数高级场景都无法使用 SSL 实现)。你可以在这里阅读关于 SI 和 SSL 的核心区别。 - Steven
1个回答

9
这取决于类在代码中的使用频率。您可能需要创建一个 IAuthenticationManager 接口,其中包括与要替换为实例方法的静态方法匹配的方法。然后,您可以创建一个 AuthenticationManager 类来实现接口,并通过其构造函数接受 UserController 依赖项。
然后,您需要将所有静态方法调用点替换为实例方法。您可能希望通过构造函数或属性将 IAuthenticationManager 注入到类中。如果需要,您还可以在方法中(在调用点处)传递 IAuthenticationManager 作为参数。
不幸的是,替换静态方法需要进行相当多的重构。但这很值得。它为单元测试打开了大门。
请记住,您始终可以通过为其中一个静态方法提取接口来逐个方法地进行重构。逐个方法地进行重构,以分步方式进行重构(换句话说,每个方法都有自己的接口)。
如果可以的话,我建议您查看这本书:《遗留代码效能优化》。这是一本很棒的书,涵盖了各种情况,例如此类情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接