共计 1429 个字符,预计需要花费 4 分钟才能阅读完成。
一个常见的误会是,@Injectable()
是咱们打算在应用程序中注入组件 / 服务的任何类的必须装璜器。这种说法并不完全正确。
当应用 Angular 装璜器时,被装璜的类以 Angular 能够读取的格局存储对于本身的元数据——这包含对于它须要获取和注入哪些依赖项的元数据。
如果一个类上没有应用 Angular 装璜器,那么 Angular 就无奈读取它须要的依赖项。这就是咱们须要应用 @Injectable() 的起因。
如果咱们的服务注入提供者,咱们必须增加 @Injectable(),这个注解除了通知 Angular 存储它须要的元数据之外,没有实现其余额定的性能。
假如咱们有上面这个 Service class:
export class UserService {isAuthenticated(): boolean {return true;}
}
对于下面这个类,咱们不须要用 @Injectable
装璜它,以便可能将其注入到组件中。因为 UserService 自身不注入任何 providers.
然而如果咱们的 Service 类自身又注入了其余的依赖:
import {Http} from '@angular/http';
export class UserService {constructor(private http: Http) {}
isAuthenticated(): Observable<boolean> {return this.http.get('/api/user').map((res) => res.json());
}
}
下面的代码无奈失常工作,因为 Http 提供程序元数据不会被存储以供 Angular 正确组合。
解决方案就是应用 @Injectable
注解:
import {Injectable} from '@angular/core';
import {Http} from '@angular/http';
@Injectable()
export class UserService {constructor(private http: Http) {}
isAuthenticated(): Observable<boolean> {return this.http.get('/api/user').map((res) => res.json());
}
}
SAP Spartacus 的例子:
对于用于 DI 的管制反转 (IOC) 容器,开发人员通常须要实现两种设置。首先是令牌。要向 IOC 容器注册依赖,须要提供一个令牌。令牌是注册任何服务的举世无双的标识符。第二件事是配置 provider 自身。提供者帮忙 DI 容器创立特定依赖项的运行时实例。
在 Angular 中,应用令牌注册服务,并将其传递给提供者的具体方法如下所述:
首先,能够应用特定的 @NgModule 注册服务。该过程是通过将服务传递给提供者数组来进行注册。上面是一个例子,应用的令牌是 typescript 类型 MyService
. 这里的提供者是 useClass. 这个提供者策略,告诉 Angular DI 框架,能够通过 new 关键字来实例化某个依赖项。
例子代码:
@NgModule({
...
providers: [
// long hand syntax
{provide: MyService, useClass: MyService},
// short hand syntax
MyService
],
})
留神下面提供了两种语法,因为 provide 和 useClass 指向的 type 定义雷同,所以能够间接简写成 MyService
.