Skip to content

Instantly share code, notes, and snippets.

@vahidvdn
Created February 20, 2024 15:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vahidvdn/37e6f6a9df89a572a0009006f940422b to your computer and use it in GitHub Desktop.
Save vahidvdn/37e6f6a9df89a572a0009006f940422b to your computer and use it in GitHub Desktop.
Implement simple dependency injection with Reflect
const reflectObj = {};
function Injectable() {
return function (target: any) {
console.log('Injectable');
Reflect.defineMetadata('injectable', true, target);
reflectObj[target] = true;
};
}
@Injectable()
class MyDependency {
doSomething() {
console.log('MyDependency is doing somethingggggggggggggggggggggggggggg');
}
}
@Injectable()
class MyService {
constructor(private myDependency: MyDependency) {}
doSomething() {
this.myDependency.doSomething();
}
}
class DependencyInjection {
static get<T>(target: any): T {
const isInjectable = Reflect.getMetadata('injectable', target);
const isInjectable2 = reflectObj[target];
console.log('isInjectablee', isInjectable, isInjectable2);
if (!isInjectable2) {
return;
// throw new Error('Target is not injectable');
}
const dependencies = Reflect.getMetadata('design:paramtypes', target) || [];
console.log(dependencies, dependencies.length);
const instances = dependencies.map((dep) => DependencyInjection.get(dep));
return new target(...instances);
}
}
const myService = DependencyInjection.get<MyService>(MyService);
console.log('myServiceeeeeee:', myService.doSomething());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment