我继承了一些带有所有静态方法的AuthenticationManager类的代码。
我正在介绍DI,并希望添加一个带有依赖项UserController的构造函数
UserController _userController;
public AuthenticationManager(UserController userCont)
{
_userController = userCont;
}
现在我得到编译时错误,因为静态方法引用了非静态变量。您的最佳实践建议是什么,以使此工作与此类和调用代码的最小更改?
我们使用SimpleServiceLocator作为IOC容器。
答案 0 :(得分:9)
这取决于整个代码中类的使用频率。您可能希望创建一个IAuthenticationManager
接口,其中包含与要用实例方法替换的静态方法匹配的方法。然后,您可以创建一个实现接口的AuthenticationManager
类,并通过其构造函数接受UserController
依赖项。
然后,您需要替换实例方法的所有静态方法调用站点。您可能希望通过构造函数或属性向类中注入IAuthenticationManager
。如果需要,您还可以将IAuthenticationManager
作为参数传递给方法(在呼叫站点)。
不幸的是,替换静态方法需要相当多的重构。值得努力。它为单元测试打开了大门。
请记住,您始终可以通过为其中一个静态方法提取接口来一次重构一个方法。一次一个地执行每个方法,以逐步的方式进行重构(换句话说,每个方法都有自己的接口)。
如果可以的话,我建议你看一下这本书:Working Effectively With Legacy Code。很棒的书,涵盖了像这样的各种情况。