思路
- 定义装饰器:创建一个装饰器函数,它接收要注入的服务类作为参数。
- 在装饰器内部:通过
Reflect.metadata
在目标类(需要注入服务的类)上存储服务类的元数据。
- 实例化和注入:在合适的地方(比如应用启动时),遍历所有标记了该装饰器的类,实例化需要注入的服务,并将其注入到目标类的实例中。
示例代码
// 定义UserService
class UserService {
getUser() {
return 'User data';
}
}
// 定义依赖注入装饰器
function Inject(serviceClass: any) {
return function (target: any) {
Reflect.defineMetadata('inject:service', serviceClass, target);
};
}
// UserController类,需要注入UserService
class UserController {
private userService: UserService;
constructor() {
const serviceClass = Reflect.getMetadata('inject:service', this.constructor);
if (serviceClass) {
this.userService = new serviceClass();
}
}
getUserData() {
return this.userService.getUser();
}
}
// 使用装饰器将UserService注入到UserController
@Inject(UserService)
class MyUserController extends UserController {}
// 使用
const controller = new MyUserController();
console.log(controller.getUserData());