【发布时间】:2015-10-28 10:15:04
【问题描述】:
一般来说,我的依赖被抽象为接口,但在非测试使用时我只会使用一个具体的实现。比如我要写FooService:
public class FooService : IFooService
{
private readonly IBarDependency _barDependency;
public FooService(IBarDependency barDependency)
{
this._barDependency = barDependency;
}
public FooService() : this (new BarDependency())
{
// nothing to do here
}
. . . // code goes here
}
现在纯粹主义者会惊恐地倒吸一口凉气,因为我在无参数构造函数中实例化了一个具体的类。过去,我对此不以为然,因为我知道我唯一不会使用具体类的时候是在进行单元测试和模拟依赖项时。
虽然它确实将FooService 类与BarDependency 类耦合,但它并不是紧密 耦合;这些类和接口也存在于同一个程序集中,所以在我看来,我并没有在这里失去很多东西,或者把自己画到一个角落里。我仍然可以轻松地测试FooService 类,而不会得到难以管理的代码,只需使用允许我传入模拟接口的构造函数。
所以问题是:这里实际上有什么风险?这种值得添加 IoC 容器的模式让我失去了什么?
【问题讨论】:
-
我在小项目中使用相同的方法。 DI 和其他“正确行事”规则通常会使小型项目过于复杂。当然,它带来了很多好处,但并不总是值得麻烦。
标签: c# interface dependency-injection