【问题标题】:Handling Inversify @inject() parameters at class instantiation using typescript使用 typescript 在类实例化时处理 Inversify @inject() 参数
【发布时间】:2018-02-28 13:45:48
【问题描述】:

尝试使用 Inversify 实现 DI,尚不清楚在进行依赖注入时如何在没有任何参数的情况下实现类实例化。这几乎等同于角度 DI。在 Angular 中,可以构造包含注入的类而无需任何 @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!
  }
}

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

【问题讨论】:

  • 您到底为什么要使用 inversify?它有什么作用?
  • @Chrillewoodz 我想为我的电子应用程序使用像 DI 一样的角度。例如。 DatabaseService 应该被注入到多个类中,但我只想在整个应用程序中处理它的单个实例。
  • 你已经可以做到了。只需将服务添加到app.module.ts 中的providers,它将只有1 个实例。
  • 你的意思是像这个example吗?
  • 没有。检查我的答案。

标签: typescript dependency-injection constructor electron inversifyjs


【解决方案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。

【讨论】:

  • 是的,我知道如何使用角度 DI,但我想避免它,因为它完全是矫枉过正。我只需要角度方式的DI。如果没有办法,我会尝试你的解决方案。
  • 我不明白这是怎么回事。你不使用 Angular 吗?因为现在你正在为 Angular 已经提供的东西包含一个完整的库。我不明白你想要达到什么目的。
  • 不,我没有在我的电子“后端”项目中使用 Angular。我正在使用 Angular 创建我的前端并在我的电子应用程序中使用它的输出。另外,我不熟悉在没有 angular CLI 且没有任何 html 模板输出的情况下使用 angular,而只是转换打字稿。如果可以的话,那就太棒了。
  • 好吧,那我真的不知道,因为我从来没有使用过 Electron。也许最好从问题中删除角度标签,因为它非常令人困惑。我以为您是在尝试在 Angular 环境中创建单例服务,而不是电子。
  • 使用了角度标签,因为我想实现像DI这样的角度。
猜你喜欢
  • 2012-01-05
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多