-
Notifications
You must be signed in to change notification settings - Fork 0
/
application-factory.ts
45 lines (36 loc) · 1.68 KB
/
application-factory.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { Container } from 'inversify';
import { APPLICATION_CONFIGURATION, APP_CONTAINER } from '../../symbols';
import { ApplicationConfigurationProvider } from './application-configuration-provider';
import { CORE } from '../../core-module';
import { Newable } from '../../implementation';
import { Binding, IMPLEMENTATION_HELPER, ImplementationHelper } from '../generics/implementation-helper';
export interface ApplicationFactory {
createApplication<T>(application: Newable<T>): T;
addImplementations(implementationList: Binding[]): void;
}
export class ConfigurableApplicationFactory implements ApplicationFactory {
private coreKernel: Container;
private applicationKernel: Container;
private implementationHelper: ImplementationHelper;
constructor(private configurationProvider: ApplicationConfigurationProvider) {
this.coreKernel = new Container();
this.applicationKernel = new Container();
this.applicationKernel.parent = this.coreKernel;
this.coreKernel
.bind(APPLICATION_CONFIGURATION)
.toConstantValue(configurationProvider);
this.coreKernel.bind<Container>(APP_CONTAINER)
.toConstantValue(this.applicationKernel);
this.coreKernel.load(CORE);
this.implementationHelper =
this.coreKernel.get<ImplementationHelper>(IMPLEMENTATION_HELPER);
}
public addImplementations(implementationList: Binding[]): void {
this.implementationHelper.addImplementations(implementationList);
}
public createApplication<T>(application: Newable<T>): T {
const applicationSymbol = Symbol('applicationSymbol');
this.applicationKernel.bind<T>(applicationSymbol).to(application);
return this.applicationKernel.get<T>(applicationSymbol);
}
}