重新配置被高估了。使用 DI 最重要的事情是可测试性。由于您的类不依赖于实现,而是依赖于抽象,因此您可以在单元测试中用模拟/存根替换它们。
例
不带 DI:
class SaleAction{
private BillingService billingService;
public SaleAction(){
billingService = new CreditCardService(); //dependency is hardcoded
}
public void pay(long amount){
//pre payment logic
billingService.pay(amount);
//post payment logic
}
}
在该示例中,假设您要对 ...你不能,因为耦合和可能运行你的测试会产生虚假的付款。SaleAction
SaleAction
CreditCardService
现在,DI 的相同示例:
class SaleAction{
private BillingService billingService;
public SaleAction(BillingService service){
billingService = service; //DI
}
public void pay(long amount){
//pre payment logic
billingService.pay(amount);
//post payment logic
}
}
现在与任何实现分离,这意味着在您的测试中您可以执行.SaleAction
SaleAction action = new SaleAction(new DummyBillingService());
希望有所帮助,还有一篇关于DI的文章,由Martin Fowler撰写,您可以在这里找到