diff --git a/src/adapters/music/VinylCatalog.ts b/src/adapters/music/VinylCatalog.ts index c715233..7a31c5a 100644 --- a/src/adapters/music/VinylCatalog.ts +++ b/src/adapters/music/VinylCatalog.ts @@ -1,7 +1,7 @@ import { Track } from "../../domain/models/Track"; -import { IMusicRepository } from "../../domain/ports/IMusicRepository"; +import { MusicRepository } from "../../domain/ports/MusicRepository"; -export class VinylCatalog implements IMusicRepository { +export class VinylCatalog implements MusicRepository { private vinylList: Track[] = new Array( new Track(1, "DNA.", "Kendrick Lamar", 340), diff --git a/src/domain/ports/IInjector.ts b/src/domain/ports/IInjector.ts deleted file mode 100644 index 2a32354..0000000 --- a/src/domain/ports/IInjector.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface IInjector { - inject(name : string) : T; -} diff --git a/src/domain/ports/IMusicRepository.ts b/src/domain/ports/IMusicRepository.ts deleted file mode 100644 index 2c1102a..0000000 --- a/src/domain/ports/IMusicRepository.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Track } from "../models/Track"; - - -export interface IMusicRepository { - get() : Track[]; - getById(id: number) : Track | null; - add(track: Track) : number; - edit(id: number, track: Track) : Track; - delete(id: number) : Track | null; -} diff --git a/src/domain/ports/Injector.ts b/src/domain/ports/Injector.ts new file mode 100644 index 0000000..48aefa8 --- /dev/null +++ b/src/domain/ports/Injector.ts @@ -0,0 +1,3 @@ +export abstract class Injector { + abstract inject(constructorFn: Function) : T; + } diff --git a/src/domain/ports/MusicRepository.ts b/src/domain/ports/MusicRepository.ts new file mode 100644 index 0000000..26ace30 --- /dev/null +++ b/src/domain/ports/MusicRepository.ts @@ -0,0 +1,10 @@ +import { Track } from "../models/Track"; + + +export abstract class MusicRepository { + abstract get() : Track[]; + abstract getById(id: number) : Track | null; + abstract add(track: Track) : number; + abstract edit(id: number, track: Track) : Track; + abstract delete(id: number) : Track | null; +} diff --git a/src/domain/services/MusicCatalogService.ts b/src/domain/services/MusicCatalogService.ts index 79d17cb..8424243 100644 --- a/src/domain/services/MusicCatalogService.ts +++ b/src/domain/services/MusicCatalogService.ts @@ -1,18 +1,18 @@ -import { IMusicRepository } from "../../domain/ports/IMusicRepository"; +import { MusicRepository } from "../../domain/ports/MusicRepository"; import { Track } from "../../domain/models/Track"; -import { IInjector } from "../../domain/ports/IInjector"; +import { Injector } from "../../domain/ports/Injector"; export class MusicCatalogService { - private repository: IMusicRepository; + private repository: MusicRepository; - constructor(repository:IMusicRepository){ + constructor(repository:MusicRepository){ this.repository = repository; } - static new(injector : IInjector) : MusicCatalogService { - return new MusicCatalogService(injector.inject("IMusicRepository")) + static new(injector : Injector) : MusicCatalogService { + return new MusicCatalogService(injector.inject(MusicRepository)) } get(): Track[] { diff --git a/src/view/MusicComponent.ts b/src/view/MusicComponent.ts index 37ca52a..656e1a9 100644 --- a/src/view/MusicComponent.ts +++ b/src/view/MusicComponent.ts @@ -1,12 +1,13 @@ import { MusicCatalogService } from "../domain/services/MusicCatalogService" -import { IMusicRepository } from "../domain/ports/IMusicRepository"; +import { MusicRepository } from "../domain/ports/MusicRepository"; import { Track } from "../domain/models/Track"; import { VinylCatalog } from "../adapters/music/VinylCatalog"; import { Wiring } from "../wiring/Wiring"; export class MusicComponent { constructor() { + const injector = Wiring.getInjector(); let musicCatalogService = MusicCatalogService.new(injector); diff --git a/src/wiring/Container.ts b/src/wiring/Container.ts index cfd862f..ed3be67 100644 --- a/src/wiring/Container.ts +++ b/src/wiring/Container.ts @@ -1,15 +1,22 @@ -import { IInjector } from "../domain/ports/IInjector" +import { Injector } from "../domain/ports/Injector" -export class Container implements IInjector { +export class Container implements Injector { private items : any = { }; - public register(name : string, fn : Function) : void { + public registerName(name : string, fn : Function) : void { + console.log(`registering ${name}`); this.items[name] = fn; } - public inject(name: string): T { + public register(nameFn : Function, fn : Function) : void { + let name = (nameFn as any).name || nameFn.prototype.name; + console.log(`registering ${name}`); + this.items[name] = fn; + } + public inject(fn: Function) : T { + let name = (fn as any).name || fn.prototype.name; if (this.items[name]) { return this.items[name](); } - throw new Error(`Failed to resolve ${name}`) + throw new Error(`Failed to resolve ${name} of ${JSON.stringify(Object.keys(this.items))}`); } } diff --git a/src/wiring/Wiring.ts b/src/wiring/Wiring.ts index 7ad7e9e..34bee35 100644 --- a/src/wiring/Wiring.ts +++ b/src/wiring/Wiring.ts @@ -1,16 +1,16 @@ -import { IInjector } from "../domain/ports/IInjector"; +import { Injector } from "../domain/ports/Injector"; import { Container } from "./Container"; import { VinylCatalog } from "../adapters/music/VinylCatalog"; +import { MusicRepository } from "../domain/ports/MusicRepository"; export class Wiring { - private static injector : IInjector; + private static injector : Injector; public static apply() : void { - console.log('registering IMusicRepository'); - const container = new Container(); - container.register('IMusicRepository', () => new VinylCatalog()); - Wiring.injector = container; + const container = new Container(); + container.register(MusicRepository, () => new VinylCatalog()); + Wiring.injector = container; } - public static getInjector() : IInjector { + public static getInjector() : Injector { if (!Wiring.injector) { Wiring.apply(); }