当并非所有实例都被使用时,依赖注入是一个好主意吗?

Rau*_*uez 4 .net c# dependency-injection inversion-of-control unity-container

我支持在您的应用程序上使用依赖注入,尽管有些人认为它会给代码增加不必要的复杂性.在过去的几天里,我想知道,在某些情况下,使用DI时可能会有一些浪费.

让我用代码示例解释一下:

使用DI

public class Class 
{
    private Service1 service1;
    private Service2 service2;

    public MyClass (Service1 service1, Service2 service2) 
    {
        this.service1 = service1;
        this.service2 = service2;
    }

    private int SampleMethod() 
    {
        Console.WriteLine("doing something with service 1");
        service1.DoSomething();
        return 0;
    }

    private int SampleMethod2() 
    {
        Console.WriteLine("doing something with service 2");
        service2.DoSomethingElse();
        return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我很少调用SampleMethod2并且每次需要一个Class实例时我会注入它会怎么样?那不是在浪费资源吗?

我几天前得到了这个问题,我正试图找出答案.是否更容易不使用DI并让每个方法在使用时创建他们需要的实例以避免这种"浪费"?

由于DI提供的解耦,这是否是合理的"浪费"?

Bra*_*NET 7

是的,它将被"浪费",但废物的性质取决于它的设置:

  • 如果Service2始终作为新实例创建; 那是相当昂贵的
  • 如果Service2是单实例模式,它所做的就是获取现有实例(超便宜)
  • 如果Class是单实例模式; 它获取实例并且不注入任何新内容

此外,这表明违反了SRP.也许Class应该分成两个对象,一个依赖于Service1一个对象,一个依赖于Service 2(甚至两者).

无论如何,"浪费"只有在实际影响您的应用时才是重要的,DI的好处远远超过这些问题.