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

时间:2019-04-01 07:04:13

标签: node.js typescript dependency-injection inversifyjs

我是Nodejs和Typescript的新手,来自C#。 我想在项目中使用依赖注入,发现最受欢迎的软件包是inverseify。

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

例如让我感到困扰的是,我需要在构造函数中的参数之前添加@inject:

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

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

我不明白为什么@inject需要字符串文字,而不能仅仅基于类型...

是否有更整洁的方式做到这一点?

1 个答案:

答案 0 :(得分:1)

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

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

限制是只能以这种方式注入类实例:

constructor(foo: FooClass) {}

泛型将被忽略并丢弃:

constructor(foo: FooClass<Bar>) {}

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

constructor(foo: fooSymbol) {}

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

相同的applies to InversifyJS

  

在进行混凝土注入的情况下,您可以简单地定义构造函数   像往常一样使用参数,而不使用@inject装饰器。

     

InversifyJS还支持TypeScript的构造函数分配,因此您可以   参数中可以包含私有或受保护的访问修饰符,并且   容器将毫无困难地注入依赖项

如果@injectWeapon是类,则可以省略ThrowableWeapon,但在列出的示例TYPES.Weapon is a symbol and Weapon is an interface that doesn't exist at runtime中,因此@inject是必需的。 / p>