依赖注入是什么意思?

时间:2015-12-10 09:09:28

标签: c# dependency-injection language-agnostic conceptual

TL; DR版本

您能否向“爱好者”程序员解释依赖注入的概念?对编程有基本的了解。即类,函数和变量。

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

我原来更加华丽的版本!

我的编码技巧相当简陋。 (这不是我的主要技能,但它有时会派上用场来证明概念的某些东西)我可以把东西放在一起并使事情有效,但我总是完全清楚有很多更好的东西/更有效的做事方式。

主要是我在函数,类和变量之间蹦蹦跳跳! (就像我很久以前在c64上学到的那样!)

依赖注入似乎最近到处都是,虽然我觉得我有点理解,但我觉得我错过了一点(或者其他什么)

问题似乎是当我试图谷歌来了解它在基础层面上是什么时,它很快变得非常复杂并且我的头部受伤(我是一个非常小的大脑和大词混淆了我!)

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

这在很大程度上与语言无关,它似乎是所有语言都使用的东西,但我选择的语言通常是C#(通常是ASP / MVC,虽然是一些原生Windows /控制台),尽管我最近开始探索还有Nodejs。

实际上这似乎是这个问题的重复 - What is dependency injection?

(比我的版本好得多! - 这就是我对胡扯的看法)

2 个答案:

答案 0 :(得分:2)

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

对于spring,我最熟悉DI的情况,我想在 config.xml 文件中的类路径,我可以将这个类引用传递给我需要它的任何类叫做。注入的类就像一个单例,因为只传递了一个引用,而没有将它声明为单例。它通常是一个注入的服务类。

依赖注入允许客户端灵活地进行配置。只修复了客户端的行为。这样可以节省更换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;
        }
    } 

可以在第二个示例中创建相同的issuse,但是通过在构造函数中包含所有依赖项,对于查看代码正在使用的内容的开发人员而言,这使得服务已经从启动。

答案 1 :(得分:1)

根据上下文,

Code Injection可能有不同的含义。

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

在其他情况下(例如aspect-oriented programming),它可能意味着使用附加代码修补方法的方法。

Dependency Injection是不同的东西,意味着一部分代码(例如一个类)以一种模块化的方式访问依赖项(代码的其他部分,例如其他类,它依赖于它)被硬编码(因此他们可以自由地改变或被覆盖,甚至可以根据需要在其他时间加载)