繁体   English   中英

在 Node.js 中注入 Typescript 依赖项的更好方法?

[英]A better way to inject Typescript dependencies in Node.js?

我正在使用 Typescript 在 Node.js 和 Express 中开发后端解决方案。 我正在尝试进行类似于 Angular 的依赖注入,但缺少@Injectable()装饰器我正在这样做:

依赖:

export class SomeDependency {
  public someMethod() {
    console.log('Some method is running');
  }
}

家长:

import { SomeDependency } from './someDependency';

export class Whatever {

  constructor(
    private someDependency = new SomeDependency()
  ) {}

  public doSomething() {
    console.log('Look, I\'m doing something!');
    this.someDependency.someMethod();
  }
}

它有效,但它可能不是最好的方法。 任何有关如何改进它的建议表示赞赏。

另一方面,你们怎么看:像这样在构造函数中导入依赖项,还是每次或大部分时间都创建new实例更好? 像这样:

import { SomeDependency } from './someDependency';

export class Whatever {

  public doSomething() {
    console.log('Look, I\'m doing something!');
    new someDependency().someMethod();
  }
}

由于SomeDependency不是单例,我想知道哪个效率较低:在父级中保持一个实例处于活动状态,或者每次都创建一个新实例,让垃圾收集器在调用完成时处理它。

你的用例是绝对正确的。 保持模块轻耦合始终是一个好习惯。 因此,将来您可以在不触及主要逻辑的情况下在实现之间切换,但 Javascript 或 Typescript 不提供依赖注入机制。

为此,您可以使用称为 Inversify 的库。

Inversify 是用于 JavaScript 和 NodeJS 的强大且轻量级的控制容器反转。 它实现了 IoC 并允许我们注入依赖项,将我们的方法与任何实现细节分离

它为您提供与我们在 Angular 中使用的功能相同的功能,例如您可以使用 @Injectable() 注释对类进行注释并执行依赖注入。

作为参考,您可以访问: https ://www.linkedin.com/pulse/how-use-dependency-injection-nodejs-typescript-projects-ribeiro

你可能想看看Dime 这是我为依赖注入创建的一个非常简单的库,类似于 Angular。 Github 页面wiki上有更多详细信息。 它仍处于早期开发阶段,因此可能存在错误。

例子:

import { ItemsService } from './items-service'; // ItemsService is an interface
import { Inject } from '@coined/dime';

class ItemsWidget {
    @Inject()
    private itemsService: ItemsService;

    render() {
        this.itemsService.getItems().subscribe(items => {
            // ...
        })
    }
}

// Setup
const appPackage = new Package("App", {
    token: "itemsService",
    provideClass: AmazonItemsService // Use any implementation
});

Dime.mountPackages(appPackage);

// Run the application
const widget = new ItemsWidget();
widget.render();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM