Angular 通过接口的角度4 DI

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

我遵循了如何通过接口使用InjectionToken进行注入的文档。我刚刚创建了一个小项目-

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');