change in domain strategy
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
|
||||
import { IPortResolver } from '../domain/ports/IPortResolver';
|
||||
import { IPortResolver } from '../domain/exports/IPortResolver';
|
||||
|
||||
|
||||
export class PortResolver implements IPortResolver {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
18
src/domain/dependencies.ts
Normal file
18
src/domain/dependencies.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
|
||||
import { IPortResolver } from "./exports/IPortResolver";
|
||||
import { IMusicRepository } from "./imports/IMusicRepository";
|
||||
|
||||
class Dependencies
|
||||
{
|
||||
private portResolver: IPortResolver;
|
||||
private resolve<T>(name : string) : T {
|
||||
return this.portResolver.resolve(name);
|
||||
}
|
||||
public setResolver(portResolver : IPortResolver) {
|
||||
this.portResolver = portResolver;
|
||||
}
|
||||
|
||||
get MusicRepository() { return this.resolve<IMusicRepository>('IMusicRepository'); }
|
||||
}
|
||||
const dependencies = new Dependencies();
|
||||
export default dependencies;
|
||||
18
src/domain/domain.ts
Normal file
18
src/domain/domain.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
|
||||
import { IPortResolver } from "./exports/IPortResolver";
|
||||
import { IMusicCatalog } from "./exports/IMusicCatalog";
|
||||
|
||||
class Domain
|
||||
{
|
||||
private portResolver: IPortResolver;
|
||||
private resolve<T>(name : string) : T {
|
||||
return this.portResolver.resolve(name);
|
||||
}
|
||||
public setResolver(portResolver : IPortResolver) {
|
||||
this.portResolver = portResolver;
|
||||
}
|
||||
|
||||
get MusicCatalog() { return this.resolve<IMusicCatalog>('IMusicCatalog'); }
|
||||
}
|
||||
const domain = new Domain();
|
||||
export default domain;
|
||||
10
src/domain/exports/IMusicCatalog.ts
Normal file
10
src/domain/exports/IMusicCatalog.ts
Normal file
@@ -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;
|
||||
}
|
||||
5
src/domain/exports/IPortResolver.ts
Normal file
5
src/domain/exports/IPortResolver.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
|
||||
|
||||
export interface IPortResolver {
|
||||
resolve<T>(name : string) : T;
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
|
||||
|
||||
export interface IPortResolver {
|
||||
resolve<T>(name : string) : T;
|
||||
}
|
||||
|
||||
export let currentPortResolver : IPortResolver;
|
||||
export let setCurrentPortResolver = (resolver : IPortResolver) => currentPortResolver = resolver;
|
||||
@@ -1,9 +1,7 @@
|
||||
|
||||
import { IPortResolver, currentPortResolver } from '../ports/IPortResolver';
|
||||
|
||||
export class BaseService {
|
||||
protected PortResolver: IPortResolver;
|
||||
constructor() {
|
||||
this.PortResolver = currentPortResolver;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>('IMusicRepository', () => fakeMusicRepository);
|
||||
let musicCatalogService = new MusicCatalogService();
|
||||
musicCatalogService.get();
|
||||
let spiedGet = spyOn(fakeMusicRepository, 'get').and.returnValue([]);
|
||||
resolver.registerInstance<IMusicRepository>('IMusicRepository', () => fakeMusicRepository);
|
||||
resolver.registerInstance<IMusicCatalog>('IMusicCatalog', () => new MusicCatalogService());
|
||||
domain.MusicCatalog.get();
|
||||
|
||||
expect(spiedGet.calls.count()).toBe(1);
|
||||
|
||||
|
||||
@@ -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>('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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>('IMusicRepository', () => fakeMusicRepository);
|
||||
let musicCatalogService = new MusicCatalogService();
|
||||
resolver.registerInstance<IMusicRepository>('IMusicRepository', () => fakeMusicRepository);
|
||||
resolver.registerInstance<IMusicCatalog>('IMusicCatalog', () => new MusicCatalogService());
|
||||
expect(domain.MusicCatalog).not.toBe(null);
|
||||
|
||||
let musicComponent = new MusicComponent();
|
||||
expect(musicComponent).not.toBe(null);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>('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;
|
||||
@@ -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>('IMusicRepository', () => new VinylCatalog());
|
||||
domain.setResolver(portResolver);
|
||||
dependencies.setResolver(portResolver);
|
||||
|
||||
setCurrentPortResolver(portResolver);
|
||||
// register imports
|
||||
portResolver.registerInstance<IMusicRepository>('IMusicRepository', () => new VinylCatalog());
|
||||
|
||||
// register exports
|
||||
portResolver.registerInstance<IMusicCatalog>('IMusicCatalog', () => new MusicCatalogService());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const wiring = new Wiring();
|
||||
wiring.apply();
|
||||
export default wiring;
|
||||
Reference in New Issue
Block a user