From 70ce7711a78f5572eacb0925734b64f88ea476de Mon Sep 17 00:00:00 2001 From: Niels Kooiman Date: Tue, 27 Feb 2018 23:04:37 +0100 Subject: [PATCH] Dependency Injector --- src/adapters/music/VinylCatalog.ts | 8 ++++---- src/domain/models/Track.ts | 19 ++++++++--------- src/view/MusicComponent.ts | 11 +--------- src/wiring/Container.ts | 15 ++++++++++++++ src/wiring/Wiring.ts | 33 +++++++++++++++--------------- 5 files changed, 45 insertions(+), 41 deletions(-) create mode 100644 src/wiring/Container.ts diff --git a/src/adapters/music/VinylCatalog.ts b/src/adapters/music/VinylCatalog.ts index f3fc7b5..c715233 100644 --- a/src/adapters/music/VinylCatalog.ts +++ b/src/adapters/music/VinylCatalog.ts @@ -15,7 +15,7 @@ export class VinylCatalog implements IMusicRepository { return this.vinylList; } getById(id: number): Track | null { - return this.vinylList.filter(track => track.Id == id).pop() as Track; + return this.vinylList.filter(track => track.id == id).pop() as Track; } add(track: Track): number { return this.vinylList.push(track); @@ -23,9 +23,9 @@ export class VinylCatalog implements IMusicRepository { edit(id: number, track: Track): Track { var existingTrack = this.getById(id); if (existingTrack) { - existingTrack.Artist = track.Artist; - existingTrack.Title = track.Title; - existingTrack.Duration = track.Duration; + existingTrack.artist = track.artist; + existingTrack.title = track.title; + existingTrack.duration = track.duration; return existingTrack; } throw new Error("Track not found"); diff --git a/src/domain/models/Track.ts b/src/domain/models/Track.ts index 01cac9d..734e2f7 100644 --- a/src/domain/models/Track.ts +++ b/src/domain/models/Track.ts @@ -1,15 +1,14 @@ -export class Track{ - +export class Track { constructor(id: number, title: string, artist: string, duration:number){ - this.Id= id; - this.Title= title; - this.Artist= artist; - this.Duration= duration; + this.id= id; + this.title= title; + this.artist= artist; + this.duration= duration; } - public Id : number; - public Title: string; - public Artist: string; - public Duration: number; + public id : number; + public title: string; + public artist: string; + public duration: number; } diff --git a/src/view/MusicComponent.ts b/src/view/MusicComponent.ts index 5d66596..37ca52a 100644 --- a/src/view/MusicComponent.ts +++ b/src/view/MusicComponent.ts @@ -3,20 +3,11 @@ import { MusicCatalogService } from "../domain/services/MusicCatalogService" 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() { - - console.log('registering IMusicRepository'); - Wiring.register('IMusicRepository', () => new VinylCatalog()); - - var injector = Wiring.GetInjector(); - let musicRepository = injector.inject("IMusicRepository"); - console.log('IMusicRepository is', musicRepository); - - //let musicCatalogService = new MusicCatalogService(injector.inject("IMusicRepository")); + const injector = Wiring.getInjector(); let musicCatalogService = MusicCatalogService.new(injector); let track = new Track(8, "Niels 1st", "Niels Kooiman", 45); diff --git a/src/wiring/Container.ts b/src/wiring/Container.ts new file mode 100644 index 0000000..cfd862f --- /dev/null +++ b/src/wiring/Container.ts @@ -0,0 +1,15 @@ + +import { IInjector } from "../domain/ports/IInjector" + +export class Container implements IInjector { + private items : any = { }; + public register(name : string, fn : Function) : void { + this.items[name] = fn; + } + public inject(name: string): T { + if (this.items[name]) { + return this.items[name](); + } + throw new Error(`Failed to resolve ${name}`) + } +} diff --git a/src/wiring/Wiring.ts b/src/wiring/Wiring.ts index f59655c..7ad7e9e 100644 --- a/src/wiring/Wiring.ts +++ b/src/wiring/Wiring.ts @@ -1,20 +1,19 @@ +import { IInjector } from "../domain/ports/IInjector"; +import { Container } from "./Container"; +import { VinylCatalog } from "../adapters/music/VinylCatalog"; -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(); +export class Wiring { + private static injector : IInjector; + public static apply() : void { + console.log('registering IMusicRepository'); + const container = new Container(); + container.register('IMusicRepository', () => new VinylCatalog()); + Wiring.injector = container; } - - public inject = function(name : string) : T { - if (Wiring.container[name]) { - return Wiring.container[name](); + public static getInjector() : IInjector { + if (!Wiring.injector) { + Wiring.apply(); } - throw new Error(`Failed to resolve ${name}`) - }; -}; + return Wiring.injector; + } +}