无法用DI注入课程

时间:2017-02-09 11:06:55

标签: typescript dependency-injection aurelia aurelia-dialog

我有一个类使用来自' aurelia-dialog`的DialogService实例来打开我Aurelia应用程序中的几乎每个对话框。以非常抽象的方式,类看起来像这样:

export class DialogTrigger{
    triggerDialogA() {...}
    triggerDialogB() {...}
    triggerDialogC() {...}
}

一切正常,直到我尝试将DialogTrigger注入其中一个对话框。

所以,让我们说我想创建一个新的对话框DialogD。我只需在triggerDialogD()中添加另一个方法DialogTrigger即可打开一个带有DialodD视图模型的新对话框,一切正常。但是如果我希望我的新对话框也通过使用DialogTrigger的实例触发其他对话框(A,B或C)之一,那么一切都会崩溃。

如果我将DialogTrigger注入DialogD,我总会收到错误:

  

键/值不能为null或未定义。您是否尝试注入/注册DI不存在的东西?

如果删除依赖项,则对话框有效。

TL; DR 我有一个DialogTrigger课程,可以打开aurelia-dialog个。当我将DialogTrigger注入由它实例化的任何对话框时,DI失败。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

听起来像循环依赖问题。

您必须使用路径字符串来引用DialogTrigger中的对话框。您无法将Dialog导入DialogTrigger,然后将DialogTrigger导入Dialog

这样可行:

import { DialogService } from 'aurelia-dialog';

export class DialogTrigger {
  static inject = [DialogService];

  constructor(dialogService) {
    this._dialogService = dialogService;
  }

  openDialogA() { this._dialogService.open({ viewModel: './prompt' }); }
  openDialogB() { this._dialogService.open({ viewModel: './prompt' }); }
}

不会工作:

import { DialogService } from 'aurelia-dialog';
import { Prompt } from './prompt';

export class DialogTrigger {
  static inject = [DialogService];

  constructor(dialogService) {
    this._dialogService = dialogService;
  }

  openDialogA() { this._dialogService.open({ viewModel: Prompt }); }
  openDialogB() { this._dialogService.open({ viewModel: Prompt }); }
}

另一种选择是将引用传递给DialogTrigger函数的open()参数中的model: {}。像这样:

this._dialogService.open({ viewModel: './prompt', model: { dialogTrigger: this }  });