From 6ddb90e8e2e33719586bf6fe8f826aade88a4278 Mon Sep 17 00:00:00 2001 From: Niels Kooiman Date: Mon, 26 Feb 2018 13:05:32 +0100 Subject: [PATCH] Injector Example --- src/domain/ports/IInjector.ts | 3 +++ src/domain/services/MusicCatalogService.ts | 8 +++++++- src/view/MusicComponent.ts | 23 +++++++--------------- src/wiring/Wiring.ts | 20 +++++++++++++++++++ 4 files changed, 37 insertions(+), 17 deletions(-) create mode 100644 src/domain/ports/IInjector.ts create mode 100644 src/wiring/Wiring.ts diff --git a/src/domain/ports/IInjector.ts b/src/domain/ports/IInjector.ts new file mode 100644 index 0000000..2a32354 --- /dev/null +++ b/src/domain/ports/IInjector.ts @@ -0,0 +1,3 @@ +export interface IInjector { + inject(name : string) : T; +} diff --git a/src/domain/services/MusicCatalogService.ts b/src/domain/services/MusicCatalogService.ts index 37c0d72..79d17cb 100644 --- a/src/domain/services/MusicCatalogService.ts +++ b/src/domain/services/MusicCatalogService.ts @@ -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")) } get(): Track[] { diff --git a/src/view/MusicComponent.ts b/src/view/MusicComponent.ts index b003dc3..5d66596 100644 --- a/src/view/MusicComponent.ts +++ b/src/view/MusicComponent.ts @@ -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"); console.log('IMusicRepository is', musicRepository); - let musicCatalogService = new MusicCatalogService(musicRepository); + //let musicCatalogService = new MusicCatalogService(injector.inject("IMusicRepository")); + let musicCatalogService = MusicCatalogService.new(injector); let track = new Track(8, "Niels 1st", "Niels Kooiman", 45); musicCatalogService.add(track); diff --git a/src/wiring/Wiring.ts b/src/wiring/Wiring.ts new file mode 100644 index 0000000..f59655c --- /dev/null +++ b/src/wiring/Wiring.ts @@ -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(name : string) : T { + if (Wiring.container[name]) { + return Wiring.container[name](); + } + throw new Error(`Failed to resolve ${name}`) + }; +};