在Angular 2中@Inject和构造函数注入作为正常参数有什么区别?

在Angular 2中@Inject和构造函数注入作为正常参数有什么区别?,angular,Angular,在这两个场景中我有点困惑,我们用@Injectable()decorator标记一些类,以便它们可以被注入到不同的组件中。我只是想知道@Inject()和构造函数注入之间的区别 场景1-使用@Inject(): @Component({ selector: 'main-app', template: ` .... {{_service.getName()}} .... ` }) export class AppCompone

在这两个场景中我有点困惑,我们用@Injectable()decorator标记一些类,以便它们可以被注入到不同的组件中。我只是想知道@Inject()构造函数注入之间的区别

场景1-使用@Inject():

@Component({
    selector: 'main-app',
    template: `
        ....
        {{_service.getName()}}
        ....
    `
})
export class AppComponent{
    constructor(@Inject(AppService) private _service){}
    ....
}
场景2-用作正常参数:

@Component({
    selector: 'main-app',
    template: `
        ....
        {{_service.getName()}}
    `
})
export class AppComponent{
    constructor(private _service:AppService){}
    ....
}

两种方案都有效,有什么区别吗?哪一个更可取

对于可注入令牌不是类的情况,确实应该只使用
@Inject
。如果您不熟悉令牌是什么,那么Angular基本上就是使用它来识别要注入的内容。比如说

providers: [
  AuthService,
  { provide: Http, useValue: new CustomHttpImpl() }
]
这里我们有两个不同的提供者,
AuthService
CustomHttpImpl
。使用
AuthService
时,令牌是
AuthService
。这意味着我们注入了
AuthService
,显然使用了
AuthService
类型

constructor(private authService: AuthService) {}
使用此构造函数,Angular知道如何使用令牌
AuthService
查找
AuthService

在第二个提供者中,我们提供了一个
CustomHttpImpl
,但这次我们使用了令牌
Http
。所以我们不能注入
CustomHttpImpl
,我们需要注入
Http
,因为这是令牌

// this will actually be the CustomHttpImpl, not Angular's Http
constructor(private http: Http)

// error: No provider for CustomHttpImpl
constructor(private http: CustomHttpImpl)
因此,您可以从中看出标记都是类,这足以让Angular了解如何注入

但是假设我们有一个字符串,或者一个数组,我们想要注入一些东西。我们不能将其与任何类令牌绑定,因此我们需要创建一个人工令牌

import { OpaqueToken } from '@angular/core';

let numbers = [ 1, 2, 3, 4 ];
let config = '{ "some": "json", "config": "data" }'

const NUMBERS = new OpaqueToken('app.numbers');
const CONFIG = new OpaqueToken('app.config');
现在我们有了要注入的项目的令牌。当我们配置
提供者时,我们使用这些令牌,当我们注入时,我们
@inject(TOKEN)


更新
现在,对于Angular 4,我们应该使用
InjectionToken
而不是
OpaqueToken

nice的可能副本,我非常感谢您的回复。顺便说一句,在“但是让我们假设我们有一个字符串”之前,我会添加字符串标记的示例(没有OpaqueToken),这样他们就可以看到共谋的问题在哪里。这就引出了你写的关于蛋白石的东西。@peeskillet我有点困惑
OpaqueToken
是一个类,
InjectionToken
扩展了
OpaqueToken
。为什么我要用
@Inject
注入这些?@gravidthinks这是两种不相关的东西。您应该发布另一个带有代码示例的问题。如果不看一个例子来说明你的意思,你就很难解释你的理解哪里出了问题。我最近发现,有时使用@Inject实际上更糟糕,而不仅仅是一种替代方法。查看构造函数中的
@Inject(type)myVar:type
myVar:type
相比,前者似乎阻止了方法检查,因此我可以编写
myService.serviceFunc()
代码,如果服务上不存在
serviceFunc()
,则TypeScript不会抱怨。但是,如果我使用第二种方法,它确实会给我一个错误(应该是这样的),并且不会传输。
providers: [
  { provide: NUMBERS, useValue: numbers },
  { provide: CONFIG, useValue: config }
]

constructor(@Inject(NUMBERS) numbers: number[], @Inject(CONFIG) config: string)