Angular 使用依赖注入(Dependency Injection,简称 DI)来管理组件、指令、管道等之间的依赖关系。依赖注入是一种设计模式,它允许我们将依赖项从组件中解耦,使得代码更加模块化、可测试和维护。在 Angular 中,依赖注入主要通过以下几个方面来管理依赖:
- 提供者(Provider):在 Angular 中,我们可以使用
@Injectable()
装饰器将一个类标记为可被注入的服务提供者。这个类可以包含一个或多个依赖项,这些依赖项也将被注入到使用该服务的组件中。
@Injectable({ providedIn: 'root' }) export class MyService { constructor() { } }
- 注入器(Injector):Angular 的依赖注入系统通过注入器(Injector)来管理和分发依赖项。注入器负责创建服务实例,并在需要时将它们注入到组件、指令或其他服务中。我们可以在组件的构造函数中使用类型或元组来指定所需的依赖项,Angular 的注入器会自动为我们注入这些依赖项。
export class MyComponent implements OnInit { constructor(private myService: MyService) { } ngOnInit() { // 使用 myService } }
- 模块(Module):Angular 应用由多个模块组成,每个模块都可以定义自己的服务提供者。通过将服务提供者添加到模块的
providers
数组中,我们可以确保在整个应用中都可以访问这些服务。此外,我们还可以通过模块的imports
和exports
属性来实现依赖项的共享和传递。
@NgModule({ providers: [MyService], imports: [BrowserModule], exports: [MyService] }) export class AppModule { }
- 上下文(Context):在某些情况下,我们可能需要在组件的生命周期钩子函数或方法中访问特定的服务。为了实现这一点,我们可以使用 Angular 的
Injector
类来获取所需的依赖项。这种方法通常用于非依赖注入的场景,例如在构造函数中无法获取到依赖项的情况。
export class MyComponent implements OnInit { constructor(private injector: Injector) { } ngOnInit() { const myService = this.injector.get(MyService); // 使用 myService } }
总之,Angular 的依赖注入系统通过提供者、注入器、模块和上下文等多个方面来管理依赖关系,使得代码更加模块化、可测试和维护。