7

我已经继承了一些具有所有静态方法的AuthenticationManager类的代码。你如何重构静态类来使用依赖注入?

进出口引进DI和想补充一点,采取了依赖UserController的

UserController _userController; 

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

现在即时得到编译时错误作为一个非静态变量从一个静态方法引用的构造函数。您的最佳实践建议是什么,以使这个工作与这个类和调用代码的最小变化?

我们使用SimpleServiceLocator作为IOC容器。

+0

难道不是升级到[Simple Injector](http://simpleinjector.codeplex.com)的时候吗?我停止开发简单服务定位器。 – Steven 2011-12-23 15:59:58

+0

感谢您的提示 - 我不知道简单的注射器存在!简单注射器是否提供了解决我的问题的额外功能,还是只是一件好事? – 2011-12-28 00:20:39

+0

它没有解决你的问题,但简单的注射器更快,更干净,并且有更好的支持来添加扩展(这里描述的大多数高级场景[http://simpleinjector.codeplex.com/wikipage?title = Advanced-scenarios&referTitle = Documentation)不能用SSL实现)。您可以阅读关于核心差异的信息SI SSL [here](http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=87)。 – Steven 2011-12-28 10:27:13

回答

9

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

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

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

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

如果可以的话,我会推荐看看这本书:Working Effectively With Legacy Code。这本书涵盖了各种各样的情况。