关于依赖注入的一些想法

2024-04-23 11:18:40 浏览数 (1)

什么是依赖注入呢?谁依赖谁,谁注入谁呢,怎么依赖,怎么注入,通常我们写代码,A类可以回依赖B类,这就是依赖,那怎么实现呢,两种方式一种是直接在A类中实例化B类,这种我起个名字叫依赖写死,另一种呢,是B类实例化后,通过构造函数传入到A类中,这样A类实现了与B类的解耦。

Notification 类负责消息推送,依赖 MessageSender 类实现推送商品促销、验证码等消息给用户。我们分别用依赖注入和非依赖注入两种方式来实现一下。具体的实现代码如下所示:

代码语言:java复制
// 非依赖注入实现方式
public class Notification {
  private MessageSender messageSender;
  
  public Notification() {
    this.messageSender = new MessageSender(); //此处有点像hardcode
  }
  
  public void sendMessage(String cellphone, String message) {
    //...省略校验逻辑等...
    this.messageSender.send(cellphone, message);
  }
}

public class MessageSender {
  public void send(String cellphone, String message) {
    //....
  }
}
// 使用Notification
Notification notification = new Notification();

再看下用依赖注入方式来实现下:

代码语言:java复制
// 依赖注入的实现方式
public class Notification {
  private MessageSender messageSender;
  
  // 通过构造函数将messageSender传递进来
  public Notification(MessageSender messageSender) {
    this.messageSender = messageSender;
  }
  
  public void sendMessage(String cellphone, String message) {
    //...省略校验逻辑等...
    this.messageSender.send(cellphone, message);
  }
}
//使用Notification
MessageSender messageSender = new MessageSender();
Notification notification = new Notification(messageSender);

通过依赖注入的方式来将依赖的类对象传递进来,这样就提高了代码的扩展性,我们可以灵活地替换依赖的类。这就是依赖注入。

我们用一句话来概括就是:不通过 new() 的方式在类内部创建依赖类对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类使用。

上面代码还有继续优化的空间,我们还可以把 MessageSender 定义成接口,基于接口而非实现编程。改造后的代码如下所示:

代码语言:ts复制
public class Notification {
  private MessageSender messageSender;
  
  public Notification(MessageSender messageSender) {
    this.messageSender = messageSender;
  }
  
  public void sendMessage(String cellphone, String message) {
    this.messageSender.send(cellphone, message);
  }
}

public interface MessageSender {
  void send(String cellphone, String message);
}

// 短信发送类
public class SmsSender implements MessageSender {
  @Override
  public void send(String cellphone, String message) {
    //....
  }
}

// 站内信发送类
public class InboxSender implements MessageSender {
  @Override
  public void send(String cellphone, String message) {
    //....
  }
}

//使用Notification
MessageSender messageSender = new SmsSender();
Notification notification = new Notification(messageSender);

nestjs很好的实现了依赖注入的思路,但是我们通常在使用nestjs时,使用依赖注入时并没有特意的去实例化相应的类,而是直接通过构造函数,将参数类型传递到构造函数,这是因为nestjs框架替我们做了这一步操作,我忘了在哪里看到的了,nestjs会扫描构造函数的参数,并根据其参数类型将其实例化。

以上便是关于依赖注入的一些想法,希望对你有所帮助。

0 人点赞