打字稿依赖注入,占用空间小

typescript dependency injection with little footprint

我是 nodejs 和 typescript 的新手,来自 C#。 我想在我的项目中使用依赖注入,发现最受欢迎的包是inversify。

我开始使用它,但我不喜欢我必须到处添加装饰器的事实。

例如,令我烦恼的是我需要在构造函数中的参数前添加@inject:

public constructor(
    @inject(TYPES.Weapon) katana: Weapon,
    @inject(TYPES.ThrowableWeapon) shuriken: ThrowableWeapon
)

这意味着每个 class 都必须知道 TYPES 对象...

我不明白为什么@inject 需要字符串字面值而不能仅根据类型注入...

有没有更简洁的方法来做到这一点?

与严格类型化的语言相比,TypeScript 类型在运行时不存在。可以在运行时使用类型信息进行依赖注入,但方式有限。通过使用 emitDecoratorMetadata TypeScript 选项,可以获取构造函数参数类型并将它们用于 DI。

示例是injection-js,它是从库中提取供独立使用的Angular注入器。启用 DI class 时只需要 @Injectable 装饰器,@Inject 参数装饰器是可选的。

限制是只能通过这种方式注入 class 个实例:

constructor(foo: FooClass) {}

泛型被忽略并丢弃:

constructor(foo: FooClass<Bar>) {}

其他类型被忽略并导致DI错误:

constructor(foo: fooSymbol) {}

constructor(foo: 'foo string provider') {}

相同applies to InversifyJS:

In case of concrete injections, you can simply define your constructor parameters as usual without using the @inject decorator.

InversifyJS also supports TypeScript's constructor assignments so you can have private or protected access modifiers in your parameters and the container will have no trouble injecting the dependencies

如果 WeaponThrowableWeapon 是 class,则可以省略 @inject,但在列出的示例 TYPES.Weapon is a symbol and Weapon is an interface that doesn't exist at runtime 中,所以 @inject 是必要的。