依赖注入:在无参数构造函数中实例化具体类时会丢失什么

Jer*_*acs 7 c# dependency-injection interface

一般来说,我的依赖项被抽象为接口,但我只会在非测试使用期间使用一个具体的实现.例如,我是否写了一个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
}
Run Code Online (Sandbox Code Playgroud)

现在纯粹主义者倾向于惊恐万分,因为我在无参数构造函数中实例化了一个具体的类.在过去,我对此不以为然,因为我知道我唯一不会使用具体类的时候是单元测试和模拟依赖项.

虽然它确实将FooService班级与BarDependency班级联系起来,但它并不紧密耦合; 这些类和接口也存在于同一个程序集中,因此在我看来并不像我在这里丢失了很多东西,或者把自己画成了一个角落.我仍然可以轻松地测试FooService类而不会得到无法管理的代码,只需使用允许我传入模拟接口的构造函数.

所以问题是:这里的实际风险是什么?我有什么损失,这种模式值得添加IoC容器?

Cod*_*ter 6

例如,终身管理.也许您BarDependency在整个代码中使用并且只希望一个实例存活.如果每个用户都创建自己的实例,则无法执行此操作.

new BarDependency()如果您想要替换它,您还必须找到所有用法new NewBarDependency().

容器为您修复了这两个问题,然后在一个方法中配置对象的实例化和生命周期,即设置容器的位置.