import 'reflect-metadata';
class Container {
private services: Map<string, any> = new Map();
register(name: string, instance: any) {
this.services.set(name, instance);
}
get<T>(name: string): T {
const service = this.services.get(name);
if (!service) {
throw new Error(`Service not found: ${name}`);
}
return service;
}
}
const container = new Container();
function Injectable(constructor: Function) {
const instance = new (constructor as any)();
if(container.get(constructor.name)){
console.error("已经注册该服务")
return
}
container.register(constructor.name, instance);
}
function Inject(target: any, propertyKey: string) {
const type = Reflect.getMetadata("design:type", target, propertyKey);
const serviceName = type.name;
const value = container.get(serviceName);
target[propertyKey] = value;
}
@Injectable
class MyService {
sayHello() {
return 'Hello, world!';
}
}
@Injectable
class MyComponent {
@Inject
private myService!:MyService;
greet() {
return this.myService.sayHello();
}
}
const myComponent = new MyComponent();
console.log(myComponent.greet());