如何解释依赖注入到5

什么是解释依赖注入的好方法?

我在Google上找到了几个教程,但是他们都不会假设读者只是一个Java初学者。 你如何向新手解释这一点?


我给你五岁儿童的依赖注射。

当你为自己离开冰箱时,可能会导致问题。 你可能会打开门,你可能会得到一些妈妈或爸爸不希望你拥有的东西。 你甚至可能在寻找我们甚至没有或者已经过期的东西。

你应该做的是说明一个需求,“我需要喝点东西喝午饭”,然后当你坐下来吃饭时,我们会确保你有东西。


那这个呢?

如果你有一个Employee类,并且这个员工有一个Address你可以定义如下的Employee类:

class Employee {
    private Address address;

    // constructor 
    public Employee( Address newAddress ) {
        this.address = newAddress;
    }

    public Address getAddress() {
    return this.address;
    }
    public void setAddress( Address newAddress ) {
        this.address = newAddress;
    }
}

一切看起来都很好。

此代码显示员工与他的地址之间的HAS-A关系,没关系。

现在,这个HAS-A关系在它们之间创建了一个依赖关系。 问题出现在构造函数中。

每次你想创建一个Employee实例时,你都需要一个Address实例:

 Address someAddress = ....
 Employee oscar = new Employee( someAddress ); 

以这种方式工作会变得有问题, 尤其是当您要执行单元测试时。

当你需要测试一个特定对象时,主要的问题就出现了,你需要创建一个其他对象的实例,并且很可能你需要创建一个其他对象的实例来完成这个任务。 该链可能变得难以管理。

为了避免这种情况,你可以像这样改变构造函数:

  public Employee(){
  }

使用无参数构造函数。

然后,您可以在任何时候设置地址:

 Address someAddress = ....
 Employee oscar = new Employee();
 oscar.setAddress( someAddress ); 

现在,如果你有几个属性或者对象很难创建,这可能是一个阻力。

然而,想想这个,比方说,你添加了Department属性:

  class Employee {
      private Address address;
      private Department department;

  ....

如果你有300名员工,并且他们都需要拥有相同的部门,并且必须在其他对象之间共享相同的部门(例如公司部门名单或每个部门的角色等),那么你会很难看到Department对象的可见性并通过所有对象网络来共享它。

依赖注入的全部功能是帮助你在代码中“注入”这些依赖关系。 大多数框架允许您通过在外部文件中指定要注入的对象来完成此操作。

假定一个虚构的依赖注入器的属性文件:

  #mock employee
  employee.address = MockAddress.class
  employee.department = MockDepartment.class

  #production setup 
  employee.address = RealAddress.class
  employee.department = RealDepartment.class

您将定义要为特定场景注入的内容。

依赖注入器框架将做什么是为你设置正确的对象,所以你不必编写setAddresssetDepartment 。 这可以通过反射或代码生成或其他技术来完成。

因此,下一次您需要测试Employee类时,您可能会注入模拟AddressDepartments对象,而无需为所有测试编写所有set / get代码。 更好的是,您可以在生产代码中注入实际的 AddressDepartment对象,并且仍然可以确信您的代码可以像测试一样运行。

这很关键。

尽管如此,我认为这个解释并不适用于你所要求的5岁儿童。

我希望你仍然觉得它有用。


在编写课程时,使用其他对象是很自然的。 例如,您可能有数据库连接,或者您使用的其他服务。 这些其他对象(或服务)是依赖关系。 编写代码最简单的方法就是创建和使用这些其他对象。 但是这意味着你的对象与这些依赖关系具有不灵活的关系:不管你为什么调用你的对象,它都使用相同的依赖关系。

更强大的技术是能够创建对象并为其提供依赖性以供使用。 所以你可以创建一个数据库连接来使用,然后把它交给你的对象。 这样,您可以在不同时间使用不同的依赖关系创建对象,从而使对象更加灵活。 这是依赖注入,您将依赖关系“注入”到对象中。

顺便说一句:在使用flickr照片来说明概念的现代演示风格中,这可以用一个吸毒者用药物注射自己来说明。 哦,等等,这是注射依赖...好吧,对不起,坏玩笑。

链接地址: http://www.djcxy.com/p/77781.html

上一篇: How to explain dependency injection to a 5

下一篇: Dependency injection through constructors or property setters?