Aurelia中的模块化依赖注册

时间:2017-03-25 14:17:55

标签: typescript dependency-injection aurelia

我正在使用 TypeScript 构建Aurelia Web应用程序,并考虑到模块化。我的意思是应用程序的每个部分都应该是独立的,以便将来维护更容易。

过去几天让我头疼的是我无法弄清楚如何以(更多)模块化的方式注册我的依赖关系。我的意思是最容易用代码来说明。

例如,我的应用程序中有以下界面:

export interface HeaderItem {
    name: string;
    url: string;
}

此界面的实现显示在我的应用程序的最顶层导航部分。我们的想法是,如果应该添加一个新的顶级部分,开发人员只需实现HeaderItem接口并将实现注册到容器中。

我的导航组件的代码使用了@all注入,如下所示:

export class Header {
  headerItems: any[] = [];

  constructor(@all('HeaderItem') private _headerItems : any[]){
    this.headerItems = _headerItems;
  }
}

因此,使用HeaderItem键注册的每个类型都将从容器中解析。

困扰我的是界面的每个实现都必须在main.ts文件中注册,如下所示:

aurelia.container.registerSingleton('HeaderItem', BatchHeaderItem);  

我不喜欢那样。我正在寻找的是每个模块都可以注册其依赖关系的方式。我可以在ModuleConfiguration文件中注册main.ts类。

然而,到目前为止我尝试的是我创建了一个Module接口并为我拥有的模块实现了它。然后我尝试在configure方法中使用new创建一个实例,这会导致完全白屏。我不知道为什么会这样??

我还尝试过,我在容器中注册Module实现并在configure方法中解析它,然后尝试在其上调用一个方法,当然,这也没有按预期工作。

您是否了解使用内置Aurelia依赖注入机制分离组件注册以更适合更模块化方法的更好方法?

1 个答案:

答案 0 :(得分:1)

您是否尝试过注入Aurelia并注册模块,这样的服务?

import { autoinject } from 'aurelia-framework'
import { Aurelia } from 'aurelia-framework'

@autoinject()
export class MyModule {
  constructor(
    private aurelia: Aurelia
  ) {
    this.init();
  }

  private init(){
    this.aurelia.container.registerSingleton(...register what you want...);
  }
}