Angular 依赖注入 - 在自定义 Rxjs 操作符中注入服务
Angular 是一个固执己见的框架。看到它如何向开发人员灵活性转变并日益强大,真是令人兴奋。我相信对于 Angular 爱好者来说这是一个快乐的时代。
依赖注入和 RxJS — 在我看来,这两个强大的功能让 Angular 变得独特而灵活。RxJS 自定义运算符是将复杂逻辑组合成可重用函数的好方法。
最近我遇到了一个用例,我需要创建一个自定义 RxJS 操作符,它使用服务来实现一些复杂的用例。
您可以使用“inject”方法访问所需的服务实例,但必须在依赖注入上下文中使用inject。为此,Rxjs操作符可以注册为“InjectionToken”,使用“useFactory”函数实例化其值。由于“useFactory”是注入上下文,因此可以使用inject方法毫无问题地注入服务。
让我们看看如何在 rxjs 自定义操作符中注入下面的服务。
// Service @Injectable({ providedIn: 'root', }) export class Multiplier { public transfrom(val: number) { return val * 2; } }
下面的自定义 RxJS 运算符使用 Multiplier 服务简单地将给定值乘以 2。
import { inject, InjectionToken } from '@angular/core'; import { Multiplier } from '../services/multiplier'; import { map, OperatorFunction, pipe } from 'rxjs'; export const MULTIPLIER_OPERATOR: InjectionToken> = new InjectionToken('Multipler operator', { factory(): OperatorFunction { const multipler = inject(Multiplier); // injected Multipler service return pipe(map((x: number) => multipler.transfrom(x))); }, });
现在可以使用 `@Inject` 装饰器在组件内使用自定义操作符。
import { Component, Inject } from '@angular/core'; import { BehaviorSubject, Observable, of, OperatorFunction } from 'rxjs'; import { MULTIPLIER_OPERATOR } from './rxjs-operators/custom'; import { CommonModule } from '@angular/common'; export class App { private _count = 1; public base = new BehaviorSubject(this._count); public val = new Observable(); constructor( @Inject(MULTIPLIER_OPERATOR) // injected custom operator private multiplier: OperatorFunction) { this.val = this.base.pipe(this.multiplier); // used rxjs operator } ..... }
还有其他几种方法可以实现相同的用例,例如创建单独的服务和返回自定义运算符的方法。但我喜欢 InjectionToken 方法,因为它具有自包含性。即使引入信号,RxJS 在不久的将来也不会消失,因此值得尝试。
您可以在此处查看完整的工作示例。
祝你编码愉快...🎉