依赖项注入意味着什么

本文关键字:什么 意味着 注入 依赖 | 更新日期: 2023-09-27 18:26:20

TL;DR版本

你能向一个对编程有基本理解的"狂热程序员"解释依赖注入的概念吗。即类、函数和变量。

依赖项注入的目的是什么?它纯粹是一个可读性/易于编程的概念,还是也提供了编译时的好处?

我原来的更飘的版本

我的编码技术相当初级。(这不是我的主要技能,但有时它确实对概念验证有用)我可以把东西拼凑在一起,让事情发挥作用,但我总是非常清楚,有很多更好/更有效的做事方式。

主要是在函数、类和变量之间来回切换!(就像我很久以前在c64上学到的一样!)

依赖注入最近似乎无处不在,虽然我觉得我有点明白,但我觉得我错过了一点(或什么)

问题似乎是,当我试图在谷歌上搜索,从根本上了解它是什么时,它很快就会变得非常复杂,我的头也会痛(我是一只脑子很小的熊,大单词会让我困惑!)

所以我希望有人能向一个五岁的孩子解释依赖性注射!它是什么,我为什么需要它,它如何使我的编码更好。(理想情况下使用函数、类和变量的概念!)

这在很大程度上是独立于语言的,似乎是所有语言都使用的东西,但我选择的语言通常是C#(通常是ASP/MVC,尽管有一些原生Windows/Console),尽管我最近也开始尝试使用Nodejs。

实际上,这似乎是这个问题的重复——什么是依赖注入

(它的表现比我的版本好得多!-这就是我在waffling中得到的)

依赖项注入意味着什么

依赖注入允许开发人员将类引用放入项目中,而不必将其创建为对象。

在spring的情况下,我对DI有最多的了解,我想要config.xml文件中的类路径,如果需要调用它,我可以将这个类引用传递给任何类。被注入的类就像一个singleton,因为只传递了一个引用,而没有将其声明为singleton。它通常是一个被注入的服务类。

依赖项注入使客户端具有可配置的灵活性。只有客户的行为是固定的。这可以节省交换xml文件中要注入的内容的时间,而无需重新编译项目。

这就是为什么我说它更像是一个只使用一个实例的单例

    public class Foo {    
        // Constructor
        public Foo() {
            // Specify a specific implementation in the constructor instead of using dependency injection
            Service service1 = new ServiceExample();
        }
        private void RandomMethod() {
            Service service2 = new ServiceExample();
        }
    }

在这里,一个服务被使用两次,因为创建了两个实例。我见过这样的项目:类文件变得如此之大,其中一个服务类通过不同的方法通过一个类创建了三次。

    public class Foo {
        // Internal reference to the service
        private Service service1;
        // Constructor
        public Foo(Service service1) {
            this.service1 = service1;
        }
    } 

在第二个示例中可以创建相同的问题,但通过在构造函数中包含所有依赖项,对于查看代码的开发人员来说,使用的内容以及从一开始就已经创建的服务会更加明显。

Code Injection可能根据上下文具有不同的含义。

例如,在security上下文中,它可能意味着恶意代码被注入到应用程序中(例如sql注入)。

在其他上下文中(例如面向方面的编程),这可能意味着用一个方面的附加代码来修补方法。

依赖项注入是不同的,它意味着代码的一部分(例如类)可以以模块化的方式访问依赖项(代码的其他部分,例如它所依赖的其他类),而无需对其进行硬编码(这样它们就可以自由更改或被覆盖,甚至可以根据需要在其他时间加载)