Skip to content

Commit dbe7be7

Browse files
committed
Adds helper methods to query information in DI, allows DI to have mapped instances instead of one singleton
1 parent 5eaa136 commit dbe7be7

File tree

6 files changed

+110
-9
lines changed

6 files changed

+110
-9
lines changed

src/core/DependencyResolver.js

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,22 @@ import {
66
} from './dependencies';
77
import {ClassBuilder} from './util';
88

9-
var manager = null;
9+
var manager = new Map();
1010

1111
class DependencyResolver {
12-
constructor() {
13-
if (manager) {
14-
return manager;
12+
constructor(name) {
13+
this.name = name;
14+
const instance = manager.get(name);
15+
16+
if (instance) {
17+
return instance;
1518
}
19+
1620
this.dependencyManager = new DependencyManager();
1721
this.dependencyInjector = new DependencyInjector(this.dependencyManager);
1822
this.created = false;
19-
manager = this;
23+
24+
manager.set(this.name, this);
2025
}
2126

2227
create(servicesManager, parametersManager) {
@@ -27,6 +32,9 @@ class DependencyResolver {
2732

2833
this.dependencyManager = this.dependencyManager.create(servicesManager, parametersManager);
2934
this.created = true;
35+
36+
37+
manager.set(this.name, this);
3038
return this;
3139
}
3240

@@ -38,6 +46,8 @@ class DependencyResolver {
3846
this.dependencyManager = this.dependencyManager.initializeParameters(parameters);
3947
services = this.dependencyInjector.injectParameters(services);
4048
this.dependencyManager = this.dependencyManager.initializeServices(services);
49+
50+
manager.set(this.name, this);
4151
return this;
4252
}
4353

@@ -49,6 +59,31 @@ class DependencyResolver {
4959
getParameter(key) {
5060
return this.dependencyManager.getParameter(key);
5161
}
62+
63+
terminate() {
64+
this.dependencyManager.terminate();
65+
return this;
66+
}
67+
68+
getDependencyManager() {
69+
return this.dependencyManager;
70+
}
71+
72+
isCreated() {
73+
return this.created;
74+
}
75+
76+
getName() {
77+
return this.name;
78+
}
5279
}
5380

54-
export default new DependencyResolver();
81+
export default new DependencyResolver();
82+
83+
export function createDependencyResolver(name) {
84+
if (manager.get(name)) {
85+
return manager.get(name);
86+
}
87+
88+
return new DependencyResolver(name)
89+
};

src/core/container/Container.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,18 @@ export default class Container {
6161

6262
return this.items.get(key);
6363
}
64+
65+
getAll() {
66+
return Object.fromEntries(this.items.entries());
67+
}
68+
69+
forEach(fn) {
70+
this.items.forEach((value, key) => fn(value, key));
71+
return this;
72+
}
73+
74+
remove(key) {
75+
this.items.delete(key);
76+
return this;
77+
}
6478
}

src/core/dependencies/DependencyManager.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,24 @@ export default class DependencyManager extends ContainerManager {
7070
}
7171
return null;
7272
}
73+
74+
terminate() {
75+
this.servicesManager.terminate();
76+
this.parametersManager.terminate();
77+
return this;
78+
}
79+
80+
/**
81+
* @returns {ServicesManager}
82+
*/
83+
getServicesManager() {
84+
return this.servicesManager;
85+
}
86+
87+
/**
88+
* @returns {ParametersManager}
89+
*/
90+
getParametersManager() {
91+
return this.parametersManager;
92+
}
7393
}

src/core/dependencies/ParametersManager.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,12 @@ export default class ParametersManager extends ContainerManager {
100100

101101
return globalConfig;
102102
}
103+
104+
getParameters() {
105+
return MapFactory.convertToObject(this.parameters.items, true);
106+
}
107+
108+
terminate() {
109+
return this;
110+
}
103111
}

src/core/dependencies/ServicesManager.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export default class ServicesManager extends ContainerManager {
5555
* @memberOf ServicesManager
5656
*/
5757
get(key) {
58-
let instance = this.instances.get(key);
58+
let instance = this.getInstance(key);
5959
if (null !== instance) {
6060
return instance;
6161
}
@@ -82,6 +82,29 @@ export default class ServicesManager extends ContainerManager {
8282
return service;
8383
}
8484

85+
terminate() {
86+
this.instances.forEach((instance, key) => this.instances.remove(key));
87+
return this;
88+
}
89+
90+
/**
91+
* @returns {} {[string]: {}}
92+
*/
93+
getServices() {
94+
return this.services.getAll();
95+
}
96+
97+
/**
98+
* @returns {[]} Instance[]
99+
*/
100+
getInstanceKeys() {
101+
return Object.keys(this.instances.getAll());
102+
}
103+
104+
getInstance(key) {
105+
return this.instances.get(key);
106+
}
107+
85108
setClassBuilder(classBuilder) {
86109
this.classBuilder = classBuilder;
87110
return this;

src/index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import * as dependencies from './core/dependencies';
33
import * as entities from './core/entities';
44
import * as errors from './core/errors';
55
import * as util from './core/util';
6-
import DependencyResolver from './core/DependencyResolver';
6+
import DependencyResolver, {createDependencyResolver} from './core/DependencyResolver';
77

8-
export {DependencyResolver, container, dependencies, entities, errors, util};
8+
export default DependencyResolver;
9+
export {DependencyResolver, createDependencyResolver, container, dependencies, entities, errors, util};

0 commit comments

Comments
 (0)