Angular 2何时使用DI,提供程序或纯导入?

Ted*_*ddy 6 import dependency-injection typescript angular

什么时候合适使用什么我有点困惑。

1.使用静态函数定义类,只需导入并使用导入的名称,然后使用函数

共享类:

export class SomeClass {
   static someFunction(){
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

使用导出类的类:

import { SomeClass } from './someclassstatic'
...
constructor(){
    SomeClass.someFunction()
}
Run Code Online (Sandbox Code Playgroud)

2.定义标准类,然后通过DI进行安装

共享类:

export class SomeClassDI {
   public someFunctionDI(){
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

使用导出类的类:

import { SomeClassDI } from './someclassdi'
...
constructor(private theclassdi:SomeClassDI){
    this.theclassdi.someFunction()
}
Run Code Online (Sandbox Code Playgroud)

3.定义标准类,然后在引导时挂载为提供程序

共享类:

export class SomeClassBS {
   public someFunctionBS(){
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

引导Angular2的类

import { SomeClassBS } from './someclassbs'
...
bootstrap(AppComponent, [SomeClassBS]);
Run Code Online (Sandbox Code Playgroud)

使用导出类的类:

??? I am not sure what can be the example here. 
Run Code Online (Sandbox Code Playgroud)

提供者的正确用法是什么?

Mik*_*kki 4

这是一个有趣的问题。首先我建议你阅读这篇文章Angular 2 中的依赖注入

但如果您正在寻找简短的答案......

1.

如果您按照代码中的方式执行操作,您将收到错误,因为您没有创建 的实例,Class而只是尝试从构造函数调用函数。您可以重写此代码,它会起作用,但如果您想遵循 Angular2 代码风格最佳实践,这不是一个很好的解决方案。

import { SomeClass } from './someclassstatic'
...
constructor(){
    let someClass = new SomeClass();
    someClass.someFunction()
}
Run Code Online (Sandbox Code Playgroud)

只是为了制作工作代码的示例(您不应该使用此代码)

2.

我相信 Angular2 会返回错误。因为你不使用 DI 模式,只是注入类但从未注册它。你会得到这样的东西:

EXCEPTION: No provider for SomeClass! (AppComponent -> SomeClass)

因此,您可能也不应该使用这种编写代码的风格。

3.

最后,最好的方法是在您的应用程序中使用 DI 模式。如果您打算service在此组件中仅使用一次,则可以将其包含到providers组件注释的属性中。

@Component({
    selector: 'my-app',
    templateUrl: 'app/app.partial.html',
    providers: [SomeClass]
})
export class AppComponent {
    constructor(private someClass: SomeClass) {
        this.someClass.someFunction();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您要service在多个不同的组件中使用您的组件,您可以inject在应用程序的引导阶段使用它,并且您不必使用它在每个组件中注册它providers,您只需要在构造函数中注入它,例如在示例 2 中,不会出现错误。

希望对您有帮助!