diff --git a/src/adapters/PortResolver.ts b/src/adapters/PortResolver.ts index fb9e3e8..3d2c035 100644 --- a/src/adapters/PortResolver.ts +++ b/src/adapters/PortResolver.ts @@ -1,5 +1,5 @@ -import { IPortResolver } from '../domain/ports/IPortResolver'; +import { IPortResolver } from '../domain/exports/IPortResolver'; export class PortResolver implements IPortResolver { diff --git a/src/adapters/music/VinylCatalog.ts b/src/adapters/music/VinylCatalog.ts index 335c5a8..810ecf3 100644 --- a/src/adapters/music/VinylCatalog.ts +++ b/src/adapters/music/VinylCatalog.ts @@ -1,5 +1,5 @@ import { Track } from "../../domain/models/Track"; -import { IMusicRepository } from "../../domain/ports/IMusicRepository"; +import { IMusicRepository } from "../../domain/imports/IMusicRepository"; export class VinylCatalog implements IMusicRepository { diff --git a/src/domain/dependencies.ts b/src/domain/dependencies.ts new file mode 100644 index 0000000..7f941af --- /dev/null +++ b/src/domain/dependencies.ts @@ -0,0 +1,18 @@ + +import { IPortResolver } from "./exports/IPortResolver"; +import { IMusicRepository } from "./imports/IMusicRepository"; + +class Dependencies +{ + private portResolver: IPortResolver; + private resolve(name : string) : T { + return this.portResolver.resolve(name); + } + public setResolver(portResolver : IPortResolver) { + this.portResolver = portResolver; + } + + get MusicRepository() { return this.resolve('IMusicRepository'); } +} +const dependencies = new Dependencies(); +export default dependencies; \ No newline at end of file diff --git a/src/domain/domain.ts b/src/domain/domain.ts new file mode 100644 index 0000000..71cbbcc --- /dev/null +++ b/src/domain/domain.ts @@ -0,0 +1,18 @@ + +import { IPortResolver } from "./exports/IPortResolver"; +import { IMusicCatalog } from "./exports/IMusicCatalog"; + +class Domain +{ + private portResolver: IPortResolver; + private resolve(name : string) : T { + return this.portResolver.resolve(name); + } + public setResolver(portResolver : IPortResolver) { + this.portResolver = portResolver; + } + + get MusicCatalog() { return this.resolve('IMusicCatalog'); } +} +const domain = new Domain(); +export default domain; \ No newline at end of file diff --git a/src/domain/exports/IMusicCatalog.ts b/src/domain/exports/IMusicCatalog.ts new file mode 100644 index 0000000..d3849d1 --- /dev/null +++ b/src/domain/exports/IMusicCatalog.ts @@ -0,0 +1,10 @@ +import { Track } from "../models/Track"; + + +export interface IMusicCatalog { + get() : Track[]; + getById(id: number) : Track; + add(track: Track) : number; + edit(id: number, track: Track) : Track; + delete(id: number) : Track; +} diff --git a/src/domain/exports/IPortResolver.ts b/src/domain/exports/IPortResolver.ts new file mode 100644 index 0000000..9d9c042 --- /dev/null +++ b/src/domain/exports/IPortResolver.ts @@ -0,0 +1,5 @@ + + +export interface IPortResolver { + resolve(name : string) : T; +} \ No newline at end of file diff --git a/src/domain/ports/IMusicRepository.ts b/src/domain/imports/IMusicRepository.ts similarity index 100% rename from src/domain/ports/IMusicRepository.ts rename to src/domain/imports/IMusicRepository.ts diff --git a/src/domain/ports/IPortResolver.ts b/src/domain/ports/IPortResolver.ts deleted file mode 100644 index d7e2a7f..0000000 --- a/src/domain/ports/IPortResolver.ts +++ /dev/null @@ -1,8 +0,0 @@ - - -export interface IPortResolver { - resolve(name : string) : T; -} - -export let currentPortResolver : IPortResolver; -export let setCurrentPortResolver = (resolver : IPortResolver) => currentPortResolver = resolver; diff --git a/src/domain/services/BaseService.ts b/src/domain/services/BaseService.ts index 2ec7da2..0fe10cf 100644 --- a/src/domain/services/BaseService.ts +++ b/src/domain/services/BaseService.ts @@ -1,9 +1,7 @@ -import { IPortResolver, currentPortResolver } from '../ports/IPortResolver'; export class BaseService { - protected PortResolver: IPortResolver; constructor() { - this.PortResolver = currentPortResolver; + } } diff --git a/src/domain/services/MusicCatalogService.spec.ts b/src/domain/services/MusicCatalogService.spec.ts index a8f513d..d8c6868 100644 --- a/src/domain/services/MusicCatalogService.spec.ts +++ b/src/domain/services/MusicCatalogService.spec.ts @@ -1,23 +1,21 @@ -import '../../wiring/TestWiring'; - -import {PortResolver} from '../../adapters/PortResolver'; -import { currentPortResolver } from '../ports/IPortResolver'; -const portResolver = currentPortResolver as PortResolver; +import { resolver } from '../../wiring/TestWiring'; import { MusicCatalogService } from './MusicCatalogService'; -import { IMusicRepository } from '../ports/IMusicRepository'; +import { IMusicRepository } from '../imports/IMusicRepository'; import { Track } from '../models/Track'; +import { IMusicCatalog } from '../exports/IMusicCatalog'; +import domain from '../domain'; let fakeMusicRepository = { get: () =>{ console.log('fakeMusicRepository'); } } as IMusicRepository; -describe("MusicCatalogService", () => { +describe("MusicCatalog", () => { - it('should create a new MusicCatalogService', (done) => { + it('should create a new MusicCatalog', (done) => { - let spiedGet = spyOn(fakeMusicRepository, 'get').and.returnValue([]); - portResolver.registerInstance('IMusicRepository', () => fakeMusicRepository); - let musicCatalogService = new MusicCatalogService(); - musicCatalogService.get(); + let spiedGet = spyOn(fakeMusicRepository, 'get').and.returnValue([]); + resolver.registerInstance('IMusicRepository', () => fakeMusicRepository); + resolver.registerInstance('IMusicCatalog', () => new MusicCatalogService()); + domain.MusicCatalog.get(); expect(spiedGet.calls.count()).toBe(1); diff --git a/src/domain/services/MusicCatalogService.ts b/src/domain/services/MusicCatalogService.ts index 0a44639..faabfca 100644 --- a/src/domain/services/MusicCatalogService.ts +++ b/src/domain/services/MusicCatalogService.ts @@ -1,28 +1,25 @@ import { BaseService } from './BaseService'; -import { IMusicRepository } from "../../domain/ports/IMusicRepository"; +import dependencies from "../../domain/dependencies"; import { Track } from "../../domain/models/Track"; -export class MusicCatalogService extends BaseService { - private repository : IMusicRepository; - +export class MusicCatalogService extends BaseService { constructor(){ super(); - this.repository = this.PortResolver.resolve('IMusicRepository'); } get(): Track[] { - return this.repository.get(); + return dependencies.MusicRepository.get(); } getById(id: number): Track | null { - return this.repository.getById(id); + return dependencies.MusicRepository.getById(id); } add(track: Track): number { - return this.repository.add(track); + return dependencies.MusicRepository.add(track); } edit(id: number, track: Track): Track { - return this.repository.edit(id, track); + return dependencies.MusicRepository.edit(id, track); } delete(id: number): Track | null { - return this.repository.delete(id); + return dependencies.MusicRepository.delete(id); } } diff --git a/src/view/MusicComponent.spec.ts b/src/view/MusicComponent.spec.ts index 99a75f0..65dd0f3 100644 --- a/src/view/MusicComponent.spec.ts +++ b/src/view/MusicComponent.spec.ts @@ -1,12 +1,11 @@ -import '../wiring/TestWiring'; - -import { PortResolver } from '../adapters/PortResolver'; -import { currentPortResolver } from '../domain/ports/IPortResolver'; -const portResolver = currentPortResolver as PortResolver; +import { resolver } from '../wiring/TestWiring'; import { MusicComponent } from "./MusicComponent"; import { MusicCatalogService } from '../domain/services/MusicCatalogService'; -import { IMusicRepository } from '../domain/ports/IMusicRepository'; +import { IMusicRepository } from '../domain/imports/IMusicRepository'; +import { IMusicCatalog } from '../domain/exports/IMusicCatalog'; +import domain from '../domain/domain'; + let fakeMusicRepository = { get: () => [], @@ -16,10 +15,10 @@ let fakeMusicRepository = { describe("MusicComponent", () => { it('should create a new MusicComponent', (done) => { - //let spiedAdd = spyOn(fakeMusicRepository, 'add').and.returnValue([]); - portResolver.registerInstance('IMusicRepository', () => fakeMusicRepository); - let musicCatalogService = new MusicCatalogService(); + resolver.registerInstance('IMusicRepository', () => fakeMusicRepository); + resolver.registerInstance('IMusicCatalog', () => new MusicCatalogService()); + expect(domain.MusicCatalog).not.toBe(null); let musicComponent = new MusicComponent(); expect(musicComponent).not.toBe(null); diff --git a/src/view/MusicComponent.ts b/src/view/MusicComponent.ts index 61d5f6c..d432095 100644 --- a/src/view/MusicComponent.ts +++ b/src/view/MusicComponent.ts @@ -1,16 +1,11 @@ -import { MusicCatalogService } from "../domain/services/MusicCatalogService" -import { IMusicRepository } from "../domain/ports/IMusicRepository"; +import domain from "../domain/domain" import { Track } from "../domain/models/Track"; -import { VinylCatalog } from "../adapters/music/VinylCatalog"; export class MusicComponent { - constructor() { - let musicCatalogService = new MusicCatalogService(); - + constructor() { let track = new Track(8, "Niels 1st", "Niels Kooiman", 45); - musicCatalogService.add(track); - - let tracks = musicCatalogService.get(); + domain.MusicCatalog.add(track); + let tracks = domain.MusicCatalog.get(); } } diff --git a/src/wiring/TestWiring.ts b/src/wiring/TestWiring.ts index 4e94683..0a67d7e 100644 --- a/src/wiring/TestWiring.ts +++ b/src/wiring/TestWiring.ts @@ -1,17 +1,19 @@ -import { IPortResolver, setCurrentPortResolver } from "../domain/ports/IPortResolver"; +import domain from "../domain/domain" +import dependencies from "../domain/dependencies" import { PortResolver } from "../adapters/PortResolver"; -import { VinylCatalog } from "../adapters/music/VinylCatalog"; -import { IMusicRepository } from "../domain/ports/IMusicRepository"; export class TestWiring { - public apply() : void { - const portResolver = new PortResolver(); - portResolver.register('IMusicRepository', () => new VinylCatalog()); - - setCurrentPortResolver(portResolver); + portResolver: PortResolver; + constructor() { + this.portResolver = new PortResolver(); + domain.setResolver(this.portResolver); + dependencies.setResolver(this.portResolver); + } + get resolver() { + return this.portResolver; } } const wiring = new TestWiring(); -wiring.apply(); -export default wiring; +export const resolver = wiring.resolver; +export default wiring; \ No newline at end of file diff --git a/src/wiring/Wiring.ts b/src/wiring/Wiring.ts index 9d85ebc..c58e9ec 100644 --- a/src/wiring/Wiring.ts +++ b/src/wiring/Wiring.ts @@ -1,18 +1,24 @@ -import { IPortResolver, setCurrentPortResolver } from "../domain/ports/IPortResolver"; +import domain from "../domain/domain" +import dependencies from "../domain/dependencies" import { PortResolver } from "../adapters/PortResolver"; import { VinylCatalog } from "../adapters/music/VinylCatalog"; -import { IMusicRepository } from "../domain/ports/IMusicRepository"; +import { IMusicRepository } from "../domain/imports/IMusicRepository"; +import { IMusicCatalog } from "../domain/exports/IMusicCatalog"; +import { MusicCatalogService } from "../domain/services/MusicCatalogService"; export class Wiring { - public apply() : void { + constructor() { const portResolver = new PortResolver(); - portResolver.register('IMusicRepository', () => new VinylCatalog()); + domain.setResolver(portResolver); + dependencies.setResolver(portResolver); - setCurrentPortResolver(portResolver); + // register imports + portResolver.registerInstance('IMusicRepository', () => new VinylCatalog()); + + // register exports + portResolver.registerInstance('IMusicCatalog', () => new MusicCatalogService()); } } - const wiring = new Wiring(); -wiring.apply(); export default wiring; \ No newline at end of file