-
Notifications
You must be signed in to change notification settings - Fork 0
/
liteinjector.js
69 lines (67 loc) · 2.14 KB
/
liteinjector.js
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//A lightweight IoC container based on Martin Fowler's Inversion of Control Containers and the Dependency Injection pattern.
var injector = {
dependencies: {},
addClass: function(qualifier, obj, isSingleton) {
this.dependencies[qualifier] = {
obj: obj,
isSingleton: isSingleton,
instance: null
};
},
addObject: function(qualifier, obj) {
this.dependencies[qualifier] = {
obj: obj,
isSingleton: false
};
},
hasDependency: function(qualifier) {
return this.dependencies[qualifier] ? true : false;
},
getObject: function (obj) {
for (var prop in obj) {
if (this.dependencies[prop]) {
obj[prop] = this.dependencies[prop].obj;
}
}
return obj;
},
getInstance: function(func){
var obj = new func;
var dependencies = this.resolveDependencies(func);
func.apply(obj, dependencies);
return obj;
},
resolveDependencies: function(func) {
var args = this.getArguments(func);
var dependencies = [];
for (var idep = 0; idep < args.length; idep++) {
//Undefined dependency
if (!this.dependencies[args[idep]]) {
dependencies.push(null);
continue;
}
//Set object
if (this.dependencies[args[idep]].instance === undefined) {
dependencies.push(this.dependencies[args[idep]].obj);
continue;
}
//Instantiate class
var instance = this.dependencies[args[idep]].instance;
var isSingleton = this.dependencies[args[idep]].isSingleton;
if (isSingleton && instance) {
dependencies.push(instance);
} else if (isSingleton && !instance) {
instance = new this.dependencies[args[idep]].obj();
} else {
dependencies.push(new this.dependencies[args[idep]].obj());
}
}
return dependencies;
},
getArguments: function(func) {
//This regex is from require.js
var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
var args = func.toString().match(FN_ARGS)[1].split(',');
return args;
}
};