Angular依赖注入注解inject()和注解@Inject

选中文字可对指定文章内容进行评论啦,绿色背景文字可以点击查看评论额。

注解@Inject

Angular提供了注解@Inject来向组件或服务注入实例,例如:

@Injectable()
class AService{
  constructor(@Inject(BService) bService:BService) {
  }  
}

这等同于添加访问修饰符后去掉注解,这也是我们常用的方式,上面示例可改为:

@Injectable()
class AService{
  //去掉了注解@Inject,注意需要添加访问修饰符private/protec/public
  constructor(private bService:BService) {
  }  
}

使用@Inject()注解有个限制,它只能在构造器参数上使用。

手动依赖注入方法inject()

inject()函数是Ivy引进来的,支持使用命令式做依赖注入。相对于注解@Inject仅限在构造函数参数上使用,inject()函数使用范围有所扩大,但仍有限制。inject()函数只能在以下几处使用:

  1. 由依赖注入实例化的类构造函数,例如@Injectable或@Component。
  2. 类字段属性的初始化
  3. 在为 Provider 或 @Injectable 的 useFactory 指定的工厂函数中。
  4. 在为InjectionToken 指定的工厂函数中。

这几处都是在类实例化创建的上下文中调用inject()函数。

类的构造函数

@Injectable()
class AService
  private bService: BService;
  constructor() {
    this.bService = inject(BService);
  }  
}

类属性字段

@Injectable()
class AService
  private bService: BService = inject(BService);
  constructor() {
  }  
}

provider工厂函数

providers: [
  {provide: AService, useFactory: () => {
    const bService= inject(BService);
    return new AService(bService);
  }}
]

调用报NG0203错

在类创建上下文之外调用 inject() 函数会报错。有一个地方要注意,在创建类实例后,在类的其他方法(包括生命周期挂钩)中不允许调用 inject(), 如ngOnInit:

@Component({ ... })
export class MyComponent {
  ngOnInit() {
    // ERROR: 此处调用时已经晚了,因为MyComponent已经实例化完成
    const myService= inject(MySerivce);
  }
}

它报NG0203错误,信息类似:

core.mjs:6494 ERROR Error: NG0203: inject() must be called from an injection context
   at injectInjectorOnly (core.mjs:4768:1)
   at ɵɵinject (core.mjs:4778:1)
   at Module.ɵɵdirectiveInject (core.mjs:14430:1)

angular版本的影响

在Angular13以及之前的版本,是不支持在@Component和@Directive中使用,Angular 14已修正以支持在组件和指令中使用,修复的信息:

fix(core): set correct context for inject() for component ctors (#45991)

The `inject()` function was introduced with Ivy to support imperative injection in factory/constructor contexts, such as directive or service constructors as well as factory functions defined in `@Injectable` or `InjectionToken`. However, `inject()` in a component/directive constructor did not work due to a flaw in the logic for creating the internal factory for components/directives. The original intention of this logic was to keep `ɵɵdirectiveInject` tree- shakable for applications which don't use any component-level DI. However, this breaks the `inject()` functionality for component/directive constructors. This commit fixes that issue and adds tests for all the various cases in which `inject()` should function. As a result `ɵɵdirectiveInject` is no longer tree-shakable, but that's totally acceptable as any application that uses `*ngIf` or `*ngFor` already contains this function. It's possible to change how `inject()` works to restore this tree-shakability if needed.

 

 

版权声明:著作权归作者所有。

相关推荐

Java 数值相等判断详解(特别注意包装类型之间的比较)

Java数值类型分为基本类型,包装类型。基本类型:byte、short、 int、long、float和double包装类型:Byte、Short、Integer、Long、Float和Double数值比较可分为基本类型之间比较,基本类型与包装类类型比较,包装类型之间的比较。基本类型比较基本类型之间只能使用“==”做相等比较。比较结果就是数值是否相等。int a=1, 

Kotlin使用kotlin-kapt插件支持Android的注解处理

在Kotlin可以使用kapt插件来支持Android的注解处理。在Gradle配置kotlin-kapt插件如下:在app的build.gradle添加插件apply plugin: 'kotlin-kapt' 使用kapt添加注解依赖java使用annotationProcessor 添加的依赖改为使用kapt。例如添加dagger依赖dependencies {

C#给文档注释添加换行

错误用法:使用<br />/// 第一行 /// <br /> /// 第二行 显示出来没有效果。正确做法:使用<para>/// <summary> /// <para>第一行</para> /// <para>第二行</par

PHP添加csrf token的注意点

首先不建议使用rand(),unique()来生成,如$token = md5(uniqid(rand(), TRUE));这是因为rand()函数产生的随机字符串是可以预测的。runiqid()和md5()增加的复杂度不高。产生tokenPHP 7session_start();if (empty($_SESSION['token'])) { $_SESSION['token'] = bi

Chrome编程式卸载注册的Service Worker

if(window.navigator && navigator.serviceWorker) { navigator.serviceWorker.getRegistrations() .then(function(registrations) { for(let registration of registrations) { registration.unr

Shell脚本boolean类型的使用注意点

推荐使用方式在shell脚本里,推荐按以下方式声明和使用布尔类型。bool=trueif [ "$bool" = true ]; thenif [ "$bool" = "true" ]; thenif [[ "$bool" = true ]]; thenif [[ "$bool" = "true" ]]; thenif [[ "$bool" == true ]]; thenif [[ "$bool

winsw快速注册Windows系统服务

winsw(Windows Service Wrapper)是一个开源项目,它可以让我们快速把一个可执行的程序注册为Windows的系统服务。下载安装下载地址:https://github.com/kohsuke/winsw/releases,如图:下载对应平台的.exe(.net2和.net4)。下载地址提供了两份配置文件:sample-allOptions.xml:包含所有配置项 s

Spirng Security使用注解对方法做权限安全控制

 Spring Security默认情况下是关闭了对方法级的安全控制。可以通过xml或者是在添加了@Configuration注解的bean上添加@EnableGlobalMethodSecurity来开启对方法级别的安全控制。Spring Security 支持三种方法级注解, 分别是 JSR-205/Secured 注解/prePostEnabled,可以在开启对方法级的安全控制时设

Spring Cloud集成ZooKeeper注册中心绑定指定ip,解决UnknownHostException

Spring Cloud集成Zookeeper作为注册中心,从网关Spring Cloud GateWay转发给微服务里,在微服务里看到发送请求过来是以主机别名为url,如主机别名是server1.cluster,那么访问的地址是http://server.cluster/xxx。在GateWay有时会导致找不到服务。报类似如下的错误:500 Server Error for HTTP GET "