Angular 通过接口的角度4 DI
我遵循了如何通过接口使用InjectionToken进行注入的文档。我刚刚创建了一个小项目-Angular 通过接口的角度4 DI,angular,dependency-injection,code-injection,Angular,Dependency Injection,Code Injection,我遵循了如何通过接口使用InjectionToken进行注入的文档。我刚刚创建了一个小项目- export interface MyInterface { sayHello(); } @Injectable() export class MyService implements MyInterface { sayHello() { throw new Error("Method not implemented."); } } 我的应用程序模块 export let
export interface MyInterface {
sayHello();
}
@Injectable()
export class MyService implements MyInterface {
sayHello()
{
throw new Error("Method not implemented.");
}
}
我的应用程序模块
export let MY_SERVICE = new InjectionToken<MyInterface>('MY_SERVICE');
providers: [
{
provide: MY_SERVICE,
useClass : MyService
}
],`
这是我在Chrome工具中遇到的一个错误
compiler.es5.js:1690未捕获错误:无法解析AppComponent:(?)的所有参数。
在syntaxError(compiler.es5.js:1690)
在CompileMetadataResolver.webpackJsonp…/../compiler/@angular/compiler.es5.js.CompileMetadataResolver.\u getDependenciesMetadata(compiler.es5.js:15765)
在CompileMetadataResolver.webpackJsonp…/../compiler/@angular/compiler.es5.js.CompileMetadataResolver.\u getTypeMetadata(
这里是plunkr-中的问题是myu服务
注入令牌实际上是在用于注入之后定义的
为避免出现这种情况,应在此之前定义:
export let MY_SERVICE = new InjectionToken<MyInterface>('MY_SERVICE');
...
constructor(@Inject(MY_SERVICE) private myService: MyInterface) {
...
对于一个实际的应用程序来说,如果提供程序和使用它们的位置位于不同的模块文件中,这通常不会是一个问题。我希望它能够工作。如果我的\u服务没有在模块提供程序中注册,则会发生错误。上面的代码被截断,并且不确定它是否存在。无论如何,如果bstract类同时用作接口和令牌。@estus的可能副本我不认为它是重复的,因为我想使用精确的接口,而不是抽象类。你说的>我的服务没有在模块提供程序中注册是什么意思?我想我已经这样做了。我认为它是重复的,因为你试图做的是自然的通过抽象类实现,不需要真正的MY_服务注入令牌。在上面的代码中
MyInterface
应该没有什么区别,您可以执行@Inject(MY_服务)私人MyService:任何相同的结果。所以未注册的MyService是主要的怀疑。考虑提供可以复制的问题。@ ESTUS谢谢。但是我提供了足够的信息。请看我的问题并找出-“我的应用程序。模块”。部分。我为我的_服务提供了注册部分。作为更新,如果我这样做-@Inject(我的_服务)private myService:any
,我会得到类型支持吗?我不这么认为
export let MY_SERVICE = new InjectionToken<MyInterface>('MY_SERVICE');
...
constructor(@Inject(MY_SERVICE) private myService: MyInterface) {
...
...
constructor(@Inject(forwardRef(() => MY_SERVICE)) private myService: MyInterface) {
...
export let MY_SERVICE = new InjectionToken<MyInterface>('MY_SERVICE');