【问题标题】:Dynamic Dependency injection with Typescript using tsyringe使用 tsyringe 使用 Typescript 进行动态依赖注入
【发布时间】:2021-01-27 17:52:55
【问题描述】:

我正在尝试构建示例以了解 DI 框架/库的工作原理,但我遇到了一些问题。

我有这个接口有两种可能的实现:

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

sub.ts

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

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

sum.ts

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);
    }
}

index.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 = ???

有没有办法让我拥有两个具有不同行为的计算器,还是我做错了?

【问题讨论】:

    标签: node.js typescript dependency-injection tsyringe


    【解决方案1】:

    由于OperationSub 没有在任何地方使用,它不会影响注入的Operation 值。

    具有不同依赖集的计算器应以multiple containers 表示。求和计算器可以被视为默认实现并使用根容器,或者两种实现都可以由子容器表示,而根容器保持抽象。

    // 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);
    

    【讨论】:

      猜你喜欢
      • 2021-08-07
      • 1970-01-01
      • 2012-01-24
      • 2021-01-09
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 2015-09-26
      • 2014-01-19
      相关资源
      最近更新 更多