【发布时间】:2018-07-04 13:27:27
【问题描述】:
我正在使用 Angular (6.0.7) 构建一个应用程序,并且我正在尝试使用新创建一个服务:
@Injectable({
providedIn: 'root'
})
但是如何使用接口键入注入?
问题
我有 2 个服务,Authentication.service 和 SessionStorage.service。我想将会话存储注入身份验证服务。这可以通过以下方式完成:
constructor(private sessionStorage: SessionStorage) {
}
那里没问题。但出于面向对象的目的,我希望在此服务上方有一个interface(这样我就可以将两个本地存储服务实现为会话存储服务)。因此,我想用接口键入注入的类是合乎逻辑的,但这不能以 Angular 5 and lower does it 相同的方式完成。
那么如何使用我的界面将注入输入到这个全局服务中呢?
我试过了
Angular 服务类型描述了 InjectableProvider,但这与 InjectableProvider 的兄弟姐妹的任何参数都不匹配,因此这会产生编译器(和 tslint)错误。
@Injectable({
providedIn: 'root'
}, {provide: IStorageService, useClass: SessionStorage})
【问题讨论】:
-
我不明白这样做的目的。你想达到什么目的?
-
依赖注入应该是这样,类使用接口并且不关心代码的实现。当然 Angular 的工作方式有点不同,需要在任何地方使用“useValue”键入注入,但它的目的是相同的。
-
那你为什么不用
export class MyService implements MyInterface {...}的接口呢? -
顺便说一句,
useValue需要一个值(类的实际实例),useClass允许您使用类。所以试试useClass,也许useInterface(但这个我不确定) -
@trichetriche,不幸的是,
useClass也不起作用,因为它与 InjectableProvider 的参数不匹配(更新答案)。关于'你为什么不使用(..)实现(..)',我不想这样做,因为那样我仍然必须在构造函数中设置确切的类型,如果可能的话我想避免这种情况
标签: angular typescript service dependency-injection angular6