【发布时间】:2020-12-12 13:25:31
【问题描述】:
我正在使用 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 不是单例,我想知道哪个效率较低:在父级中保持一个实例处于活动状态,或者每次都创建一个新实例,让垃圾收集器在调用完成时处理它。
【问题讨论】:
-
IMO,我建议您仅在需要将数据与对该数据进行操作的方法捆绑在一起时才使用
class。如果您只有方法,那么普通函数(或函数对象)会更有意义。如果你只有数据,一个普通的对象或数组会更有意义。对于这里的这个例子,我会做import { someMethod } from './someMethod';其中someMethod是函数 - 然后只需在需要时调用函数。 -
我认为很多对类的混淆和过度使用可能来自于像 Java 这样具有 OO 背景的人——但 JS 完全不同
-
谢谢,但这只是我正在做的更复杂事情的一个简单示例。依赖项通常是一个控制器或具有数十种方法的 Express 中间件。所以只导入一个函数是不行的。
-
嗨,你知道依赖注入工具的 tsyringe 或 typedi 或 inversifyJs 吗?另外这篇帖子Dependency injection stackoverflow 可以帮助你:-)
标签: node.js typescript dependency-injection