[英]typescript dependency injection with little footprint
我是來自C#的Node.js和Typescript的新手。 我想在項目中使用依賴項注入,發現最受歡迎的軟件包是inverseify。
我開始使用它,但是我不喜歡必須到處添加裝飾器這一事實。
例如讓我煩惱的是,我需要在構造函數中的參數之前添加@inject:
public constructor(
@inject(TYPES.Weapon) katana: Weapon,
@inject(TYPES.ThrowableWeapon) shuriken: ThrowableWeapon
)
這意味着每個類都必須知道TYPES對象...
我不明白為什么@inject需要字符串文字並且不能僅僅基於類型來注入...
有沒有更整潔的方式做到這一點?
與嚴格類型化的語言相反,TypeScript類型在運行時不存在。 可以在運行時使用類型信息進行依賴項注入,但使用方式有限。 通過使用emitDecoratorMetadata
TypeScript選項,可以獲取構造函數參數類型並將其用於DI。
該示例是injection-js
,它是從庫中提取出來的Angular注入器,可以獨立使用。 只有@Injectable
需要裝飾要在啟用DI-類使用, @Inject
參數裝飾是可選的。
限制是只能以這種方式注入類實例:
constructor(foo: FooClass) {}
泛型將被忽略並丟棄:
constructor(foo: FooClass<Bar>) {}
其他類型將被忽略,並導致DI錯誤:
constructor(foo: fooSymbol) {}
constructor(foo: 'foo string provider') {}
這同樣適用於InversifyJS :
在進行具體注入的情況下,您可以像往常一樣簡單地定義構造函數參數,而無需使用@inject裝飾器。
InversifyJS還支持TypeScript的構造函數分配,因此您可以在參數中使用私有或受保護的訪問修飾符,並且容器將不會出現注入依賴項的麻煩
如果Weapon
和ThrowableWeapon
是類,但在列出的示例TYPES.Weapon
可以省略@inject
TYPES.Weapon
是符號,而Weapon
是運行時不存在的接口 ,因此@inject
是必需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.