Dependency injection 依赖注入问题

Dependency injection 依赖注入问题,dependency-injection,constructor,Dependency Injection,Constructor,我有一个关于依赖注入模式的问题。 我的问题是。。。 如果我使用构造函数注入,为我的类注入依赖项,我得到的是一个具有许多参数的“大”构造函数。 如果ie.I在某些方法中不使用某些参数怎么办? 我有一个公开许多方法的服务。和一个具有10个参数(所有依赖项)的构造函数。但并非所有方法都使用所有依赖项。某些方法将只使用一个依赖项,另一个将使用3个依赖项。但DI容器将解决所有这些问题,即使使用非 对我来说,这是使用DI容器的性能损失。这是真的吗?实际上,在构建DI容器时,您不知道在运行时使用了哪些方法。您

我有一个关于依赖注入模式的问题。 我的问题是。。。 如果我使用构造函数注入,为我的类注入依赖项,我得到的是一个具有许多参数的“大”构造函数。 如果ie.I在某些方法中不使用某些参数怎么办? 我有一个公开许多方法的服务。和一个具有10个参数(所有依赖项)的构造函数。但并非所有方法都使用所有依赖项。某些方法将只使用一个依赖项,另一个将使用3个依赖项。但DI容器将解决所有这些问题,即使使用非


对我来说,这是使用DI容器的性能损失。这是真的吗?

实际上,在构建DI容器时,您不知道在运行时使用了哪些方法。您必须处理这种性能损失,或者如果您知道在许多情况下只使用了几个依赖项,您可以将容器拆分为几个小容器,这些容器具有较少的注入依赖项。

您的类似乎做得太多了,它不符合(单一责任原则),也许您可以将该类拆分为多个依赖性较小的类。并非所有方法都使用所有依赖性的事实表明了这一点。

您还可以将一些尚未需要的依赖性隐藏在惰性提供程序后面。例如:

public DataSourceProvider implements Provider<DataSource> {

    public DataSource get() {
         return lazyGetDataSource();
    }

}
公共数据源提供程序实现提供程序{
公共数据源get(){
返回lazyGetDataSource();
}
}

是javax.inject包的一部分。

通常注入许多依赖项的性能损失很低,但这取决于您选择的框架。一些人会动态编译方法。您必须对此进行测试。许多依赖项确实表明您的类做得太多(如Ruben所说),所以您可能想看一看。如果创建一个通常不使用的依赖性实例会导致性能问题,那么您可能希望引入一个工厂作为依赖性。我发现使用工厂可以解决与依赖性注入框架的使用有关的许多问题

// Constructor
public Consumer(IContextFactory contextFactory)
{
    this.contextFactory = contextFactory;
}

public void DoSomething()
{
    var context = this.contextFactory.CreateNew();
    try
    {
        // use context here

        context.Commit();
    }
    finally
    {
        context.Dispose();
    }
}

正如鲁布所说,你们应该回顾你们的课堂设计,以坚持坚实的原则


无论如何,如果没有必要,我习惯于使用属性设置器依赖项而不是构造函数。这意味着您可以为所需的每个依赖项创建一个属性。这也有助于测试类,因为您可以只将所需的依赖项注入到正在进行的测试的上下文中,而不是清除所有依赖项即使你不需要它

也应该不惜一切代价避免可变状态。我同意你的看法。在我的回答中,我同意鲁布的说法,他说他可能应该检查他的班级设计。我的第二个评论只是一个实际的评论:-)