如何重构静态类以使用依赖注入?

时间:2011-12-23 00:30:26

标签: dependency-injection refactoring inversion-of-control static-methods legacy-code

我继承了一些带有所有静态方法的AuthenticationManager类的代码。

我正在介绍DI,并希望添加一个带有依赖项UserController的构造函数

UserController _userController;

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

现在我得到编译时错误,因为静态方法引用了非静态变量。您的最佳实践建议是什么,以使此工作与此类和调用代码的最小更改?

我们使用SimpleServiceLocator作为IOC容器。

1 个答案:

答案 0 :(得分:9)

这取决于整个代码中类的使用频率。您可能希望创建一个IAuthenticationManager接口,其中包含与要用实例方法替换的静态方法匹配的方法。然后,您可以创建一个实现接口的AuthenticationManager类,并通过其构造函数接受UserController依赖项。

然后,您需要替换实例方法的所有静态方法调用站点。您可能希望通过构造函数或属性向类中注入IAuthenticationManager。如果需要,您还可以将IAuthenticationManager作为参数传递给方法(在呼叫站点)。

不幸的是,替换静态方法需要相当多的重构。值得努力。它为单元测试打开了大门。

请记住,您始终可以通过为其中一个静态方法提取接口来一次重构一个方法。一次一个地执行每个方法,以逐步的方式进行重构(换句话说,每个方法都有自己的接口)。

如果可以的话,我建议你看一下这本书:Working Effectively With Legacy Code。很棒的书,涵盖了像这样的各种情况。