change in domain strategy

This commit is contained in:
2019-03-14 20:55:15 +01:00
parent 6d3f0fcabd
commit 73272d37b2
15 changed files with 108 additions and 70 deletions

View File

@@ -1,5 +1,5 @@
import { IPortResolver } from '../domain/ports/IPortResolver';
import { IPortResolver } from '../domain/exports/IPortResolver';
export class PortResolver implements IPortResolver {

View File

@@ -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 {

View 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
View 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;

View 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;
}

View File

@@ -0,0 +1,5 @@
export interface IPortResolver {
resolve<T>(name : string) : T;
}

View File

@@ -1,8 +0,0 @@
export interface IPortResolver {
resolve<T>(name : string) : T;
}
export let currentPortResolver : IPortResolver;
export let setCurrentPortResolver = (resolver : IPortResolver) => currentPortResolver = resolver;

View File

@@ -1,9 +1,7 @@
import { IPortResolver, currentPortResolver } from '../ports/IPortResolver';
export class BaseService {
protected PortResolver: IPortResolver;
constructor() {
this.PortResolver = currentPortResolver;
}
}

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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();
}
}

View File

@@ -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;

View File

@@ -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;