Injector Example
This commit is contained in:
3
src/domain/ports/IInjector.ts
Normal file
3
src/domain/ports/IInjector.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
export interface IInjector {
|
||||
inject<T>(name : string) : T;
|
||||
}
|
||||
@@ -1,12 +1,18 @@
|
||||
import { IMusicRepository } from "../../domain/ports/IMusicRepository";
|
||||
import { Track } from "../../domain/models/Track";
|
||||
import { IInjector } from "../../domain/ports/IInjector";
|
||||
|
||||
|
||||
|
||||
export class MusicCatalogService {
|
||||
private repository: IMusicRepository;
|
||||
|
||||
constructor(repository:IMusicRepository){
|
||||
this.repository= repository;
|
||||
this.repository = repository;
|
||||
}
|
||||
|
||||
static new(injector : IInjector) : MusicCatalogService {
|
||||
return new MusicCatalogService(injector.inject<IMusicRepository>("IMusicRepository"))
|
||||
}
|
||||
|
||||
get(): Track[] {
|
||||
|
||||
@@ -4,29 +4,20 @@ import { IMusicRepository } from "../domain/ports/IMusicRepository";
|
||||
import { Track } from "../domain/models/Track";
|
||||
import { VinylCatalog } from "../adapters/music/VinylCatalog";
|
||||
|
||||
import { Wiring } from "../wiring/Wiring";
|
||||
|
||||
export class MusicComponent {
|
||||
constructor() {
|
||||
|
||||
let container : any = { };
|
||||
|
||||
let register = (name : string, fn : Function) => {
|
||||
container[name] = fn;
|
||||
};
|
||||
|
||||
let inject = (name : string) : any => {
|
||||
if (container[name]) {
|
||||
return container[name]();
|
||||
}
|
||||
throw new Error(`Failed to resolve ${name}`)
|
||||
};
|
||||
|
||||
console.log('registering IMusicRepository');
|
||||
register('IMusicRepository', () => new VinylCatalog());
|
||||
Wiring.register('IMusicRepository', () => new VinylCatalog());
|
||||
|
||||
let musicRepository = inject("IMusicRepository") as IMusicRepository;
|
||||
var injector = Wiring.GetInjector();
|
||||
let musicRepository = injector.inject<IMusicRepository>("IMusicRepository");
|
||||
console.log('IMusicRepository is', musicRepository);
|
||||
|
||||
let musicCatalogService = new MusicCatalogService(musicRepository);
|
||||
//let musicCatalogService = new MusicCatalogService(injector.inject<IMusicRepository>("IMusicRepository"));
|
||||
let musicCatalogService = MusicCatalogService.new(injector);
|
||||
|
||||
let track = new Track(8, "Niels 1st", "Niels Kooiman", 45);
|
||||
musicCatalogService.add(track);
|
||||
|
||||
20
src/wiring/Wiring.ts
Normal file
20
src/wiring/Wiring.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
|
||||
import { IInjector } from "../domain/ports/IInjector"
|
||||
|
||||
export class Wiring implements IInjector {
|
||||
private static container : any = { };
|
||||
public static register(name : string, fn : Function) : void {
|
||||
Wiring.container[name] = fn;
|
||||
};
|
||||
|
||||
public static GetInjector() : IInjector {
|
||||
return new Wiring();
|
||||
}
|
||||
|
||||
public inject = function<T>(name : string) : T {
|
||||
if (Wiring.container[name]) {
|
||||
return Wiring.container[name]();
|
||||
}
|
||||
throw new Error(`Failed to resolve ${name}`)
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user