Injector Example

This commit is contained in:
2018-02-26 13:05:32 +01:00
parent 0cc84f5a58
commit 6ddb90e8e2
4 changed files with 37 additions and 17 deletions

View File

@@ -0,0 +1,3 @@
export interface IInjector {
inject<T>(name : string) : T;
}

View File

@@ -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[] {

View File

@@ -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
View 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}`)
};
};