【发布时间】:2021-05-11 15:30:26
【问题描述】:
我只是对 InjectionToken 和 Injectable 之间的差异和不同用例感到好奇。我有一个类似下面的服务:
// Service defintion:
export const MY_SERVICE_TOKEN = new InjectionToken<IMyService>('My Service', {
factory: () => new MyService(),
providedIn: 'root'
});
export interface IMyService {
readonly subject: BehaviorSubject<string>;
}
export MyService implements IMyService {
constructor() {}
subject: BehaviorSubject<string> = new BehaviorSubject<string>('initial value')
}
// Usage case:
@Component(/* Removed for Brevity */)
export class MyComponent {
constructor(@Inject(MY_SERVICE_TOKEN) private myService: IMyService) {
}
}
最初,我的服务类上有 @Injectable 指令和 providedIn: 'root' 属性集。但出于好奇,我最终将其删除,DI 仍然运行良好。从逻辑上讲,这是有道理的,因为我不是通过令牌注入类而是注入接口。所以我的问题是,我还应该在课堂上添加 Injectable 指令吗?或者如果这样做会注册两个服务?一个是用 Injectable 装饰的类,一个是通过 Token 注册的接口?
在什么情况下我会使用 Injectable 而不是 InjectionToken?
如果我不能在接口上定义 Injectable 作为 useClass 属性,还有一个额外的问题?为什么要将服务装饰为 Injectable 以仅通过 useClass 返回不同的类型?和抽象类有关吗?
【问题讨论】: