我是Nodejs和Typescript的新手,来自C#。 我想在项目中使用依赖注入,发现最受欢迎的软件包是inverseify。
我开始使用它,但我不喜欢必须到处添加装饰器的事实。
例如让我感到困扰的是,我需要在构造函数中的参数之前添加@inject:
public constructor(
@inject(TYPES.Weapon) katana: Weapon,
@inject(TYPES.ThrowableWeapon) shuriken: ThrowableWeapon
)
这意味着每个类都必须知道TYPES对象...
我不明白为什么@inject需要字符串文字,而不能仅仅基于类型...
是否有更整洁的方式做到这一点?
答案 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') {}
在进行混凝土注入的情况下,您可以简单地定义构造函数 像往常一样使用参数,而不使用@inject装饰器。
InversifyJS还支持TypeScript的构造函数分配,因此您可以 参数中可以包含私有或受保护的访问修饰符,并且 容器将毫无困难地注入依赖项
如果@inject
和Weapon
是类,则可以省略ThrowableWeapon
,但在列出的示例TYPES.Weapon
is a symbol and Weapon
is an interface that doesn't exist at runtime中,因此@inject
是必需的。 / p>