【问题标题】:Angular 2 when to use DI, provider or pure import?Angular 2 何时使用 DI、提供程序或纯导入?
【发布时间】:2025-11-24 18:25:02
【问题描述】:

什么时候该用什么我有点困惑。

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

共享类:

export class SomeClass {
   static someFunction(){
      ...
   }
}

使用导出类的类:

import { SomeClass } from './someclassstatic'
...
constructor(){
    SomeClass.someFunction()
}

2.定义标准类,然后通过 DI 挂载

共享类:

export class SomeClassDI {
   public someFunctionDI(){
      ...
   }
}

使用导出类的类:

import { SomeClassDI } from './someclassdi'
...
constructor(private theclassdi:SomeClassDI){
    this.theclassdi.someFunction()
}

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

共享类:

export class SomeClassBS {
   public someFunctionBS(){
      ...
   }
}

引导 Angular2 的类

import { SomeClassBS } from './someclassbs'
...
bootstrap(AppComponent, [SomeClassBS]);

使用导出类的类:

??? I am not sure what can be the example here. 

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

【问题讨论】:

    标签: angular typescript dependency-injection import


    【解决方案1】:

    这是一个有趣的问题。 首先我建议你阅读这篇文章Dependency Injection in Angular 2

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

    1.

    如果您按照代码中介绍的方式进行操作,则会收到错误消息,因为您没有创建Class 的实例,而只是尝试从构造函数中调用函数。你可以重写这段代码,它会起作用,但如果你想跟进 Angular2 代码风格的最佳实践,这不是很好的解决方案。

    import { SomeClass } from './someclassstatic'
    ...
    constructor(){
        let someClass = new SomeClass();
        someClass.someFunction()
    }
    

    只是做一个工作代码的例子(你不应该使用这个代码)

    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();
        }
    }
    

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

    希望对你有帮助!

    【讨论】:

    • @Teddy,它涵盖了你所有的问题吗?
    • 我不得不说 Angular 2 注入机制对我来说感觉很奇怪。如果我必须导入注入的类,这个 DI 有什么意义? DI 不应该让我从实施中抽象出来吗?
    • 我认为唯一真正的优势是 DI 允许您切换实际注入的内容...例如..在运行测试时...当 ApiService 被注入时..它可以在运行时替换为ApiMockService .... .. 之类的东西。或者你可以用你自己的切换系统ErrorHanlder..并且在任何地方注入ErrorHandler..它会注入你的。