angular - 通过构造函数参数与 Injector 服务进行注入(inject)

标签 angular dependency-injection

我现在使用 Angular2/4 几个月了,但我仍然无法弄清楚这两种方法之间有什么区别,以及关于依赖注入(inject)我应该使用哪一种

你能帮我吗。

第一种方法:通过构造函数

...
  constructor(
    private myService: MyService
  ) { 
    // this.myService.myMethod() ...
  }
...



第二种方法:通过注入(inject)器
...
  private myService: MyService;

  constructor(
    injector: Injector
  ) {
    this.myService = injector.get(MyService);
    // this.myService.myMethod() ...
  }
...

我了解每种方法的作用,但我无法找出最佳实践。

我知道这可能是一种主观意见,但我认为两者各有利弊。

感谢您的任何解释。

最佳答案

您应该始终更喜欢第一个选项:

...
  constructor(
    private myService: MyService
  ) { 
    // this.myService.myMethod() ...
  }
...

第二种方法有效,因为当您注入(inject) MyService它是使用 Injector 注入(inject)的.

Angular 使 Injector可用于注入(inject),因为您可能需要在动态实例化模块或组件时使用它:

零件:
export class ModuleLoaderComponent {
  constructor(private _injector: Injector,private loader: NgModuleFactoryLoader) { ... }

  ngAfterViewInit() {
    this.loader.load('app/t.module#TModule').then((factory) => {
      const module = factory.create(this._injector);  <-----------------

模块:
export class RouterConfigLoader {

  load(parentInjector, route) {
    ...
    const modFactory = this.loadModuleFactory(route.loadChildren);
    const module = modFactory.create(parentInjector);
  }

您可以在以下文章中阅读有关动态实例化的更多信息:
  • Avoiding common confusions with modules in Angular
  • Here is what you need to know about dynamic components in Angular

  • 正如@estus 所说,injector也用于在构造函数中注入(inject)依赖项导致循环依赖项或您希望根据某些条件获得依赖项的情况。

    关于angular - 通过构造函数参数与 Injector 服务进行注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46558847/

    相关文章:

    angular - 在 Angular 4 的 canactivate guard 中返回 observable inside observable

    javascript - 无法通过 ngSwitch 正确使用枚举

    Angular 2+ ngFor 中的 NgTemplateOutlet

    java - MessageSource bean 在自定义异常映射器类中注入(inject) null

    java - 代码重构,如何在不使父函数非静态的情况下分解两个两个静态函数

    javascript - 设置值 Angular Material 日期选择器,从外部输入

    javascript - 如何注销 ipcRenderer.on 事件监听器?

    angular - 如何使用参数实例化 Angular 组件?

    c# - 依赖注入(inject)以解决与运行时数据的依赖关系

    php - Slim Framework 3 - 如何将 $logger 注入(inject)路由 Controller