手动进行依赖注入是否可以更好地替代组成和多态性?


13

首先,我是入门级程序员;实际上,我正在整个夏季完成AS学位,并完成了最终的顶峰项目。在我的新工作中,当我没有什么项目要做(他们正在等待团队中有更多新员工的到来)时,我在等待的过程中会得到一些可供阅读和学习的书籍-一些教科书,其他与其说是“代码完成”,不如说是。看完这些书之后,我转向互联网学习尽可能多的知识,并开始学习SOLID和DI(我们谈论了Liskov的替代原理,但没有其他SOLID想法)。因此,据我所知,我坐下来做得更好,并且开始编写一些代码以手工使用DI(开发计算机上没有DI框架)。

正如我所做的那样,我发现它感觉很熟悉……而且似乎很像我过去使用多态抽象类的组合所做的工作。我在这里想念大图吗?关于DI(至少是手工),还有其他一些东西吗?我了解在某些DI框架的代码中不包含配置的可能性,这些优点在无需重新编译的情况下就具有很大的好处,但是在手工操作时,我不确定它是否与上述内容有所不同...对此有一些了解将非常有帮助!

Answers:


21

DI的基本思想只是将依赖项推入对象中,而不是让它们从外部拉出依赖项。先前也称为“控制反转”。这使人们可以更好地控制依赖关系,并且-最后但并非最不重要-编写易于进行单元测试的代码。

DI框架仅基于此思想,并且(部分)自动将连接对象依赖项的繁琐部分自动化。否则,这可能需要较大的项目中的大量代码。

为了定义依赖关系,除了外部配置文件之外,现在还可以使用代码注释,例如以Java和C#之类的语言。这可能会带来两全其美的效果:以声明式的方式连接依赖关系,但是恰好在逻辑上所属的代码本身内。对我来说,无需重新编译即可更改依赖项的可能性并不那么有价值,因为在现实生活中很少这样做(除了一些特殊情况),但引入了依赖项与代码中定义的类和对象之间的人为分离。

回到您的标题问题,DI不能替代构图或多态性。毕竟,这两个使它成为可能


1
依赖注入(DI)是控制反转(IoC)的一种形式。
马修·弗林

的确,@ MatthewFlynn。供参考:martinfowler.com/articles/injection.html
彼得Török

1
那是我的参考。他谈到了进行控制反转的新“轻量级容器”,由于UI事件侦听器是IoC的一种形式,所以这已经很普遍了。他将Spring和其他IoC容器作为依赖注入所做的对象绑定称为复制,以将其与控制反转的其他形式区分开。
马修·弗林

糟糕,我错过了“目标”。我以为你在和我矛盾...对不起。
马修·弗林

您的最后一段让我感觉好一些;在我整个学习计划的整个过程中,我一直对自己说:“这感觉就像是多态。” 不幸的是,我工作中的.Net和c#太过时了,但是从调查的角度来看,Unity是您正在谈论的内置c#框架吗?
德雷克·克拉里斯

22

我读过的关于该主题的最佳文章是James Shore的。作为抽象和多态性的一部分,我从事“ DI手工制作 ” 已有很长时间了。所以,当我坐进专业的世界,我一直听到被抛出这个词我周围有什么之间我想到了一个词断开大应该意味着什么,它实际上是指:

“依赖注入”是5美分概念的25美元术语。

那是从肖尔(Shor)的帖子,它为我清除了所有内容。例如:

给定

class Engine {public abstract void start()}
class V8 extends Engine {...}
class V6 extends Engine {...}

而不是写:

class Car
{
    private Engine engine;
    public Car()
    {
        this.engine = new V6();
    }

    public void start()
    {
        this.engine.start();
    }
}

您可以这样写:

class Car
{
    private Engine engine;
    public Car(Engine a)
    {
        this.engine = a;
    }

    public void start()
    {
        this.engine.start();
    }
}

...

Car F = new Car(new V8());

并且这避免了Car实例必须处理特定的Engine细节。汽车只需要一个引擎,只要实现基本的引擎功能,它就不在乎哪个。也就是说,您的Car类不依赖于特定的实现依赖项;它可能会在运行时“注入”到其他地方。

这个特定的Car示例使用DI的子类型,称为“构造函数注入”,这仅表示依赖项已作为构造函数参数移交。您也可以使用setEngine(Engine a)“ Setter注入”方法,依此类推,但是这些子类型对我来说似乎很古怪。

不过,还有一点,许多DI框架提供了样板,可以将一堆这些更抽象地引用的东西相互连接起来。

而已。


0

我不是专家,因为我在过去几年才开始使用DI,但是我注意到了DI容器的一些有用的主题/功能(我不认为它是组成/多态的产物) (但我可能会对此予以纠正):

  • 对象创建的中心枢纽
  • 在每个线程的基础上提供单例
  • 面向方面的技术,例如拦截

0

除DI之外,根应用程序还具有类组合配置(而不是使用xml进行配置)。即使它们可以整理类组合配置,尤其是对于大型项目,也不需要任何DI或IoC框架。这是因为DI框架通常带有实现其他功能(例如自动装配)的容器,可帮助配置类组合。您可以阅读我的博客文章,以提取对这一主题的理解。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.