首页 > 其他分享 >什么是 Angular 基于 Constructor Parameter 的 Dependency Injection

什么是 Angular 基于 Constructor Parameter 的 Dependency Injection

时间:2023-11-25 14:12:33浏览次数:25  
标签:依赖 函数参数 AppComponent LoggerService Dependency Constructor Injection Angular 注入

在 Angular 中,依赖注入(Dependency Injection, DI)是一种设计模式,用于处理如何在不同的代码部分创建和传递依赖对象。在 Angular 中,我们通常依赖于 TypeScript 的特性,如构造函数参数(constructor parameters)来执行依赖注入。

构造函数参数进行依赖注入是 Angular DI 系统的一个重要特性。在 Angular 中,任何类(如服务、组件、指令等)都可以作为其他类的依赖项。当 Angular 创建类的实例时,它首先查看类的构造函数以决定该类所需要的依赖项。然后,Angular 会查找这些依赖项,如果找到,就将它们作为参数传递给构造函数,这样就完成了依赖注入。

以下是一个简单的例子,我们创建一个 LoggerService 服务,它有一个 log 方法。然后在 AppComponent 组件中注入这个服务:

import { Injectable } from `@angular/core`;

@Injectable({
  providedIn: `root`,
})
export class LoggerService {
  log(message: string) {
    console.log(`LoggerService: ${message}`);
  }
}

import { Component } from `@angular/core`;
import { LoggerService } from `./logger.service`;

@Component({
  selector: `app-root`,
  templateUrl: `./app.component.html`,
  styleUrls: [`./app.component.css`],
})
export class AppComponent {
  title = `app`;

  constructor(private logger: LoggerService) {
    this.logger.log(`Hello!`);
  }
}

在以上代码中,AppComponent 组件的构造函数有一个参数 logger,其类型为 LoggerService。Angular 通过这个构造函数参数知道 AppComponent 需要一个 LoggerService 的实例。因此,当 Angular 创建 AppComponent 的实例时,它会首先创建一个 LoggerService 的实例(如果还没有的话),然后将这个实例传给 AppComponent 的构造函数。

构造函数参数进行依赖注入的优点:

  1. 代码解耦:通过依赖注入,我们可以轻松地在不同的类之间共享相同的服务实例。这使得代码更加模块化和可重用。
  2. 测试方便:在测试时,我们可以轻松地为依赖项提供模拟对象,这使得单元测试变得更加容易。
  3. 对象的创建和生命周期管理由 Angular 框架处理,开发者可以更专注于业务逻辑的实现。

构造函数参数进行依赖注入的缺点:

  1. 如果依赖关系过于复杂,可能导致代码阅读和维护的困难。
  2. 依赖注入的错误通常在运行时才会被发现,可能会使调试变得困难。

标签:依赖,函数参数,AppComponent,LoggerService,Dependency,Constructor,Injection,Angular,注入
From: https://www.cnblogs.com/sap-jerry/p/17855466.html

相关文章

  • Angular 使用 Constructor Parameters 进行依赖注入的优缺点
    构造函数参数(ConstructorParameters)在Angular中是一种进行依赖注入(DependencyInjection)的重要方式之一。依赖注入是一种设计模式,通过该模式,一个类的依赖关系不是在类内部直接创建,而是通过外部提供这些依赖关系。在Angular中,依赖注入通过注入器(Injector)来实现,而构造函数参数是一......
  • 常用的maven dependency依赖
    <dependencies><!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope><......
  • Constructors in '@immutable' classes should be declared as 'const'.
    警告信息Flutter开发遇到如下警告Constructorsin'@immutable'classesshouldbedeclaredas'const'.报错代码classTaskWidgetextendsStatefulWidget{finalStringtitle;finalboolisChecked;finalintorder;TaskWidget({requiredthis.......
  • Bean instantiation via constructor failed; nested exception is org.springframewo
    一、从公司的的GitLab下载项目到本地二、nacos-2.0.1启动不了我以为是我中文路径问题,然后放到全是英文的一样报错,百度一圈没找到解决方法。三、大佬路过,瞟了我一眼的电脑解决了。删除D:\nacos-2.0.0\data 下面的所有文件即可 原因就是有人把自己的数据上传到git了,导致......
  • Angular 依赖注入系统里 Injection token PLATFORM_ID 的使用场景
    Angular的依赖注入系统是它的核心特性之一,它使得我们可以轻松地在应用程序的各个部分共享和管理代码。在Angular的依赖注入系统中,InjectionToken是一个特别重要的概念。InjectionToken是一个用于参数类型的标记类,它可以用来在依赖注入器中注入特定的值。在这里,我们将重点讨论......
  • Prompt Engineering & Prompt Injection 提示词工程
    \(\quad\)提示词工程是通过使用提示词,挖掘大模型的潜力。只不过有人使用该方法做出一些违背开发者本意的事情。\(\quad\)简单理解是,说明我是谁,我遇到了什么,我需要提供什么帮助。通过这些提示词,让大模型精确度理解我么得需求。但有时会遇到一些安全性问题(奶奶工具)。......
  • 如何解决 Critical dependency: the request of a dependency is an expression ?
    更多ruoyi-nbcio功能请看演示系统gitee源代码地址前后端代码:ruoyi-nbcio:nbcio-boot的若依版本,基于ruoyi-flowable-plus和flowable6.7.2,目前处于开发功能完善阶段,目标是打造一个最好的若依平台上flowable流程管理系统开源版本,后续也增加一个仿钉钉流程设计,希望有需要的同仁一起......
  • Angular 依赖注入系统里 Injection token APP_BASE_HREF 的使用场景
    Angular的依赖注入系统是其核心功能之一,它提供了一种优雅的方式来管理应用中的服务和组件之间的依赖关系。在Angular中,我们可以使用各种方式来提供依赖项,而APP_BASE_HREF是其中的一个依赖注入标记。APP_BASE_HREF是一个Injectiontoken,它在Angular的路由系统中扮演了重......
  • 【springboot项目运行报错】亲测有效 Parameter 0 of constructor in xxx.xxx.Control
    Parameter0ofconstructorinme.zhengjie.modules.system.rest.DictDetailControllerrequiredabeanoftype'me.zhengjie.modules.system.service.DictDetailService'thatcouldnotbefound.1.点击界面左侧的maven管理,再点击root下的生命周期,点击clean(也可以直接控制台......
  • 请问以下两次检测对象constructor是否拥有属性名1的结果分别是什么?
    请问以下两次检测对象constructor是否拥有属性名1的结果分别是什么?1inObject(1.0).constructor;Number[1]=123;1inObject(1.0).constructor;false、true实际上Object(1.0)就是将数字“1.0”封装成它对应的包装类的一个对象实例比如Number(1.0),所以目的是为了检测1是否在Nu......