【发布时间】: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 相同)告诉我们,由于我们需要类中其他类对象的实例,所以我们有一些依赖类。但是在这个定义中,它告诉我们有来自不同类的对象,我们想要将它注入到你的类中,你应该创建一些变量来保存这些值。
我认为令人困惑的问题是属性创建的时间。我认为首先我们创建属性然后我们有一些依赖关系,而不是假设某个类作为依赖关系,然后创建一些属性来将这些值保存在主机类中。(客户端类)
有人可以解释一下吗?
【问题讨论】:
-
依赖表示“需要”,注入表示“提供”。因此,如果汽车需要轮胎,那么您将轮胎提供给汽车(当您创建它时)。
-
请记住,这些类实际上应该命名为
CarService和TireService,因为它们实际上并不代表汽车或一组轮胎,您可以在其中“添加”(安装、安装)4汽车上的轮胎(或更多或更少),然后可能稍后更换它们。它们也不代表可能指定其随附的默认轮胎品牌/类型的汽车型号。命名类很重要,像这样错误命名的类只会增加混乱。 -
@chrylis-onstrike- ,你说得对,评论中解释得很好。
-
@MehSar 您通常不会对 OO / DTO / POJO 类使用注入,这些类通常是从客户端请求或数据库记录中实例化的。您将注入与诸如 service 类之类的东西一起使用,这些类通常是单例的,并且通常由注入框架实例化。你自己说的“教练说我们要在Car类中使用Tiresservice”,暗示这两个类都是service类,也就是与使用注射相一致。
-
@MehSar 相比之下,
CarService类没有color属性。CarDTO 类将具有getColor()方法。CarService类没有属性(它可能有仅供内部使用的字段),但它可能具有类似Car buildCar(Color)或Car getCar(String tag)的方法,用于从具有该牌照的汽车的数据库中加载Car值。
标签: java dependency-injection dependencies dependency-management inject