【问题标题】:dependency injection: Which one should be made first? attributes(fields) or dependency?依赖注入:应该先做哪一个?属性(字段)或依赖项?
【发布时间】:2020-07-12 16:08:33
【问题描述】:

我是依赖注入的新手,我遇到了一些问题。

首先我知道:

来自 Christoffer Noring,Pablo Deeleman 的著作《Learning Angular - Second Edition》:

随着我们的应用程序的发展和演变,我们的每一个代码实体 将在内部需要其他对象的实例,这样更好 在软件工程领域称为依赖项。那个行动 将此类依赖项传递给依赖客户端的方法称为 注射。

然后,在一些教程视频中,讲师说我们想在 Car 类中使用 Tires 服务,因此我们将其注入到 Car 类中,然后我们将创建一个属性(轮胎)来保存它:

public class Car {

    private Tires tires; 

    public Car(Tires tires){
        this.tires = tires;
    }
}

我不同意这个定义,这让我感到困惑,因为我认为这个定义(教师的定义)与另一个定义形成对比。

大部分关于 DI 的文章(与关于 Angular 相同)告诉我们,由于我们需要类中其他类对象的实例,所以我们有一些依赖类。但是在这个定义中,它告诉我们有来自不同类的对象,我们想要将它注入到你的类中,你应该创建一些变量来保存这些值。

我认为令人困惑的问题是属性创建的时间。我认为首先我们创建属性然后我们有一些依赖关系,而不是假设某个类作为依赖关系,然后创建一些属性来将这些值保存在主机类中。(客户端类)

有人可以解释一下吗?

【问题讨论】:

  • 依赖表示“需要”,注入表示“提供”。因此,如果汽车需要轮胎,那么您将轮胎提供给汽车(当您创建它时)。
  • 请记住,这些类实际上应该命名为CarServiceTireService,因为它们实际上并不代表汽车或一组轮胎,您可以在其中“添加”(安装、安装)4汽车上的轮胎(或更多或更少),然后可能稍后更换它们。它们也不代表可能指定其随附的默认轮胎品牌/类型的汽车型号。命名类很重要,像这样错误命名的类只会增加混乱。
  • @chrylis-onstrike- ,你说得对,评论中解释得很好。
  • @MehSar 您通常不会对 OO / DTO / POJO 类使用注入,这些类通常是从客户端请求或数据库记录中实例化的。您将注入与诸如 service 类之类的东西一起使用,这些类通常是单例的,并且通常由注入框架实例化。你自己说的“教练说我们要在Car类中使用Tiresservice,暗示这两个类都是service类,也就是与使用注射相一致。
  • @MehSar 相比之下,CarService 类没有 color 属性。 Car DTO 类将具有 getColor() 方法。 CarService 类没有属性(它可能有仅供内部使用的字段),但它可能具有类似 Car buildCar(Color)Car getCar(String tag) 的方法,用于从具有该牌照的汽车的数据库中加载 Car 值。

标签: java dependency-injection dependencies dependency-management inject


【解决方案1】:

我认为首先我们创建属性

我认为您可能将 OOP 概念与注入混淆了。

Carservice类(与OOP无关),需要访问Tiresservice类,所以Car实例需要一个@ 987654325@实例在构建过程中注入,需要保存以备后用,所以将引用存储在字段中(不是属性1)。

当我们决定需要保存注入的引用以供以后使用时,该字段被定义(声明为“创建”)。

我猜你可以说当我们意识到我们需要对Tire服务的引用时定义(“创建”)该字段,然后将它作为依赖项添加到构造函数中,但这只是关于何时编写代码的语义,即是在编写需要它的代码之前先查看并创建依赖项,还是在编写代码时即时创建依赖项。

1) 当我们有供外部类使用的 getter(和 setter)方法时,使用“属性”一词。注入的引用,仅供内部使用,不被视为类的“属性”。

【讨论】:

  • 很好的解释。非常非常感谢。
  • 你的汽车服务类,需要访问轮胎服务类,所以它期望在构建过程中注入一个轮胎实例 ...... 那么谁创建了 Tire 实例,Tire 服务类??
  • @VishwaRatna 错过了s。固定和澄清。他们在类名中没有Service 不是我的错。见other comment
猜你喜欢
  • 2011-05-07
  • 2020-12-28
  • 1970-01-01
  • 2020-01-19
  • 2020-12-20
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 2015-07-07
相关资源
最近更新 更多