设计思路
- 创建一个依赖容器:用于存储依赖实例。
- 定义属性装饰器:在装饰器函数中,从依赖容器中获取对应的依赖实例并注入到类的属性上。
关键代码示例
// 依赖容器
const dependencyContainer: { [key: string]: any } = {};
// 注册依赖
function registerDependency(key: string, instance: any) {
dependencyContainer[key] = instance;
}
// 依赖注入装饰器
function inject(key: string) {
return function (target: any, propertyKey: string) {
let value: any;
Object.defineProperty(target, propertyKey, {
get() {
if (!value) {
value = dependencyContainer[key];
}
return value;
},
set(newValue) {
value = newValue;
},
enumerable: true,
configurable: true
});
};
}
// 示例依赖类
class ExampleDependency {
sayHello() {
return 'Hello from ExampleDependency';
}
}
// 注册依赖
registerDependency('exampleDependency', new ExampleDependency());
// 使用依赖注入的类
class MyClass {
@inject('exampleDependency')
myDependency: ExampleDependency;
doSomething() {
return this.myDependency.sayHello();
}
}
const myClass = new MyClass();
console.log(myClass.doSomething());