问题描述
我正在尝试构建示例,以了解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;
}
}
calculator.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 = ???
有没有办法让我有两个行为不同的计算器,或者我做错了吗?
解决方法
由于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);