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

Ste*_*ard 7 refactoring static-methods dependency-injection legacy-code inversion-of-control

我继承了一些代码,它有一个带有所有静态方法的AuthenticationManager类.

我介绍DI并想添加一个带有依赖UserController的构造函数

UserController _userController;

public AuthenticationManager(UserController userCont)
{
    _userController = userCont;
}
Run Code Online (Sandbox Code Playgroud)

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

我们使用SimpleServiceLocator作为IOC容器.

Jas*_*own 9

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

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

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

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

如果可以的话,我建议你看看这本书:有效地使用遗留代码.很棒的书,涵盖了像这样的各种情况.