我们的应用程序中有一个相当普遍的对象。在这种情况下,我们称之为球。球运行良好,但在一些配置中,它们的作用不同。它目前的设置是这样的:具有配置依赖性的常用对象
class Ball
{
private static readonly bool BallsCanExplode;
static Ball()
{
bool.TryParse(ConfigurationManager.AppSettings["ballsCanExplode"],
out BallsCanExplode);
}
public Ball(){}
}
这在实践中完全正常。如果配置是球可以爆炸,它们会爆炸,如果没有爆炸,则不爆炸。问题是它完全不可测试。我一直无法找出一个好方法来保持它的可测试性,并且仍然很容易实例化。
最简单的解决方法就是解耦球和配置:
class Ball
{
private readonly bool CanExplode;
public Ball(bool canExplode);
}
这样做的问题是,这个曾在Ball类孤立的依赖,现在已经蔓延到每一个班级,使一个球。如果这种依赖被注入,那么爆炸球的知识必须注入到处。
BallFactory存在同样的问题。虽然每个班级都可以去new Ball()
,但现在必须知道必须在任何地方注入的BallFactory。另一种选择是使用已经被烤到应用程序的服务定位器:
class Ball
{
private readonly bool CanExplode;
public Ball()
{
CanExplode = ServiceLocator.Get<IConfiguration>().Get("ballsCanExplode");
}
}
这仍保持在球的配置依赖,但允许测试配置在被注入球用这么多。尽管如此,在每个new Ball()
调用中找到该服务似乎有点矫枉过正。
保持这种可测试性以及易于实例化的最佳方法是什么?
注意:应用程序中同时存在依赖注入框架和服务定位器,这两者都经常使用。
那些D.I.像Ninject这样的库有帮助吗? – xandy 2010-11-03 15:35:08
您似乎意识到依赖注入选项,但不想遵循它们。因此,你最好的选择是添加一个构造函数进行测试:public Ball(bool CanExplode) – 2010-11-03 21:30:19