[英]A better way to inject Typescript dependencies in Node.js?
我正在使用 Typescript 在 Node.js 和 Express 中開發后端解決方案。 我正在嘗試進行類似於 Angular 的依賴注入,但缺少@Injectable()
裝飾器我正在這樣做:
依賴:
export class SomeDependency {
public someMethod() {
console.log('Some method is running');
}
}
家長:
import { SomeDependency } from './someDependency';
export class Whatever {
constructor(
private someDependency = new SomeDependency()
) {}
public doSomething() {
console.log('Look, I\'m doing something!');
this.someDependency.someMethod();
}
}
它有效,但它可能不是最好的方法。 任何有關如何改進它的建議表示贊賞。
另一方面,你們怎么看:像這樣在構造函數中導入依賴項,還是每次或大部分時間都創建new
實例更好? 像這樣:
import { SomeDependency } from './someDependency';
export class Whatever {
public doSomething() {
console.log('Look, I\'m doing something!');
new someDependency().someMethod();
}
}
由於SomeDependency
不是單例,我想知道哪個效率較低:在父級中保持一個實例處於活動狀態,或者每次都創建一個新實例,讓垃圾收集器在調用完成時處理它。
你的用例是絕對正確的。 保持模塊輕耦合始終是一個好習慣。 因此,將來您可以在不觸及主要邏輯的情況下在實現之間切換,但 Javascript 或 Typescript 不提供依賴注入機制。
為此,您可以使用稱為 Inversify 的庫。
Inversify 是用於 JavaScript 和 NodeJS 的強大且輕量級的控制容器反轉。 它實現了 IoC 並允許我們注入依賴項,將我們的方法與任何實現細節分離
它為您提供與我們在 Angular 中使用的功能相同的功能,例如您可以使用 @Injectable() 注釋對類進行注釋並執行依賴注入。
作為參考,您可以訪問: https ://www.linkedin.com/pulse/how-use-dependency-injection-nodejs-typescript-projects-ribeiro
你可能想看看Dime 。 這是我為依賴注入創建的一個非常簡單的庫,類似於 Angular。 Github 頁面和wiki上有更多詳細信息。 它仍處於早期開發階段,因此可能存在錯誤。
例子:
import { ItemsService } from './items-service'; // ItemsService is an interface
import { Inject } from '@coined/dime';
class ItemsWidget {
@Inject()
private itemsService: ItemsService;
render() {
this.itemsService.getItems().subscribe(items => {
// ...
})
}
}
// Setup
const appPackage = new Package("App", {
token: "itemsService",
provideClass: AmazonItemsService // Use any implementation
});
Dime.mountPackages(appPackage);
// Run the application
const widget = new ItemsWidget();
widget.render();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.