我們的應用程序中有一個相當普遍的對象。在這種情況下,我們稱之爲球。球運行良好,但在一些配置中,它們的作用不同。它目前的設置是這樣的:具有配置依賴性的常用對象
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