簡體   English   中英

在 Node.js 中注入 Typescript 依賴項的更好方法?

[英]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.

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