簡體   English   中英

打字稿依賴注入,占用空間少

[英]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的構造函數分配,因此您可以在參數中使用私有或受保護的訪問修飾符,並且容器將不會出現注入依賴項的麻煩

如果WeaponThrowableWeapon是類,但在列出的示例TYPES.Weapon可以省略@inject TYPES.Weapon是符號,而Weapon是運行時不存在的接口 ,因此@inject是必需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM