处理使用typescript在类实例化中反转@inject()参数

问题描述 投票:1回答:1

尝试使用Inversify实现DI,在进行依赖注入时,我不清楚如何在没有任何参数的情况下实现类实例化。这几乎等同于角度DI。在角度中,可以构造包含注入的类,而不包含任何@Inject参数。

app.module.ts

import { Container } from 'inversify';

export class AppModule {
  constructor() {
    let container = new Container(); // maybe use { autoBindInjectable: true }
    const instance = new DatabaseService(); // DatabaseService is injectable
  }
}

根模块创建Inversify Container并收集所有可注入的类实例。 DatabaseService类应包含所有数据库操作,并具有@injectable装饰器。

models.ts

import { DatabaseService } from './database.service';
import { inject } from 'inversify';

export class Models {
  constructor(@inject(DatabaseService) dbService: DatabaseService) {}
}

Models获得了DatabaseService的可注射实例。在另一个类中,我现在想要创建Models的实例。如何在没有任何参数的情况下实现类实例化?喜欢它是有角的。

myclass.ts

import { Models } from './models.component'

export class MyClass {
  constructor() {
    models = new Models() // Want no constructing parameters!
  }
}

你有什么想法或建议吗?谢谢!

typescript dependency-injection constructor electron inversifyjs
1个回答
1
投票

您可以简单地使用Angular本身提供的内容,而不是使用Inversify。创建一个可以处理应用程序实例的新模块:

@NgModule({
  providers: [
    DatabaseService
  ]
})

export class CoreModule {

  constructor (@Optional() @SkipSelf() private parentModule: CoreModule) {

    if (parentModule) {
      throw new Error('CoreModule already loaded');
    }
  }
}

在构造函数中检查是可选的,但阻止CoreModule被加载两次,确保您的注射剂只有1个实例。

然后将此模块导入AppModule

@NgModule({
  imports: [
    CoreModule
  ]
})

export class AppModule {}

现在你可以完全放弃Inversify。

© www.soinside.com 2019 - 2024. All rights reserved.