簡體   English   中英

使用 tsyringe 的 Typescript 動態依賴注入

[英]Dynamic Dependency injection with Typescript using tsyringe

我正在嘗試構建和示例以了解 DI 框架/庫的工作原理,但我遇到了一些問題。

我有這個接口有兩種可能的實現:

export interface Operation {
    calculate(a: number, b: number): number;
}

子.ts

import { Operation } from "./operation.interface";

export class Sub implements Operation {
    calculate(a: number, b: number): number {
        return Math.abs(a - b);
    }
}

總和

import { Operation } from "./operation.interface";

export class Sum implements Operation {
    calculate(a: number, b: number): number {
        return a + b;
    }

}

計算器.ts

import { Operation } from "./operation.interface";
import {injectable, inject} from "tsyringe";

@injectable()
export class Calculator {
    constructor(@inject("Operation") private operation?: Operation){}

    operate(a: number, b: number): number {
        return this.operation.calculate(a, b);
    }
}

索引.ts

import "reflect-metadata";
import { container } from "tsyringe";
import { Calculator } from "./classes/calculator";
import { Sub } from "./classes/sub";
import { Sum } from "./classes/sum";

container.register("Operation", {
    useClass: Sum
});

container.register("OperationSub", {
    useClass: Sub
});

const calculatorSum = container.resolve(Calculator);

const result = calculatorSum.operate(4,6);
console.log(result);

// const calculatorSub = ???

有沒有辦法讓我可以有兩個具有不同行為的計算器,或者我完全錯了?

由於OperationSub未在任何地方使用,因此它不會影響注入的Operation值。

具有不同依賴集的計算器應該用多個容器表示。 求和計算器可以被視為默認實現並使用根容器,或者兩種實現都可以由子容器表示,而根容器仍然是抽象的。

// common deps are registered on `container`
const sumContainer = container.createChildContainer();
const subContainer = container.createChildContainer();

sumContainer.register("Operation", { useClass: Sum });  
subContainer.register("Operation", { useClass: Sub });

const calculatorSum = sumContainer.resolve(Calculator);
const calculatorSub = subContainer.resolve(Calculator);

暫無
暫無

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

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