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容器.
那么它取决于整个代码中类的使用频率.您可能希望创建一个IAuthenticationManager接口,其中包含与要用实例方法替换的静态方法匹配的方法.然后,您可以创建一个AuthenticationManager实现接口的类,并UserController通过其构造函数接受依赖项.
然后,您需要替换实例方法的所有静态方法调用站点.您可能希望IAuthenticationManager通过构造函数或属性将类注入到类中.如果需要,您还IAuthenticationManager可以将方法(在调用站点)作为参数传递给方法.
不幸的是,替换静态方法需要相当多的重构.值得努力.它为单元测试打开了大门.
请记住,您始终可以通过为其中一个静态方法提取接口来一次重构一个方法.一次一个地执行每个方法,以逐步的方式进行重构(换句话说,每个方法都有自己的接口).
如果可以的话,我建议你看看这本书:有效地使用遗留代码.很棒的书,涵盖了像这样的各种情况.
| 归档时间: |
|
| 查看次数: |
1455 次 |
| 最近记录: |