Mercurial > pub > ImplabJs
comparison core/src/js/di/ActivationContext.js @ 34:27e8e9e38e07 default tip
Слияние
| author | nickolay |
|---|---|
| date | Wed, 05 Jun 2019 20:44:15 +0300 |
| parents | acdcdf1a8d21 |
| children |
comparison
equal
deleted
inserted
replaced
| 33:8af8e840dd49 | 34:27e8e9e38e07 |
|---|---|
| 1 define([ | |
| 2 "../declare", | |
| 3 "../safe", | |
| 4 "./Descriptor", | |
| 5 "./ValueDescriptor", | |
| 6 "../log/trace!" | |
| 7 ], function (declare, safe, Descriptor, Value, trace) { | |
| 8 var Context = declare(null, { | |
| 9 | |
| 10 _cache: null, | |
| 11 | |
| 12 _services: null, | |
| 13 | |
| 14 _stack: null, | |
| 15 | |
| 16 _visited: null, | |
| 17 | |
| 18 container: null, | |
| 19 | |
| 20 _trace: true, | |
| 21 | |
| 22 constructor: function (container, services, cache, visited) { | |
| 23 safe.argumentNotNull(container, "container"); | |
| 24 safe.argumentNotNull(services, "services"); | |
| 25 | |
| 26 this._visited = visited || {}; | |
| 27 this._stack = []; | |
| 28 this._cache = cache || {}; | |
| 29 this._services = services; | |
| 30 this.container = container; | |
| 31 }, | |
| 32 | |
| 33 getService: function (name, def) { | |
| 34 var d = this._services[name]; | |
| 35 | |
| 36 if (!d) | |
| 37 if (arguments.length > 1) | |
| 38 return def; | |
| 39 else | |
| 40 throw new Error("Service '" + name + "' not found"); | |
| 41 | |
| 42 return d.activate(this, name); | |
| 43 }, | |
| 44 | |
| 45 /** | |
| 46 * registers services local to the the activation context | |
| 47 * | |
| 48 * @name{string} the name of the service | |
| 49 * @service{string} the service descriptor to register | |
| 50 */ | |
| 51 register: function (name, service) { | |
| 52 safe.argumentNotEmptyString(name, "name"); | |
| 53 | |
| 54 if (!(service instanceof Descriptor)) | |
| 55 service = new Value(service, true); | |
| 56 this._services[name] = service; | |
| 57 }, | |
| 58 | |
| 59 clone: function () { | |
| 60 return new Context( | |
| 61 this.container, | |
| 62 Object.create(this._services), | |
| 63 this._cache, | |
| 64 this._visited | |
| 65 ); | |
| 66 | |
| 67 }, | |
| 68 | |
| 69 has: function (id) { | |
| 70 return id in this._cache; | |
| 71 }, | |
| 72 | |
| 73 get: function (id) { | |
| 74 return this._cache[id]; | |
| 75 }, | |
| 76 | |
| 77 store: function (id, value) { | |
| 78 return (this._cache[id] = value); | |
| 79 }, | |
| 80 | |
| 81 parse: function (data, name) { | |
| 82 var me = this; | |
| 83 if (safe.isPrimitive(data)) | |
| 84 return data; | |
| 85 | |
| 86 if (data instanceof Descriptor) { | |
| 87 return data.activate(this, name); | |
| 88 } else if (data instanceof Array) { | |
| 89 me.enter(name); | |
| 90 var v = data.map(function (x, i) { | |
| 91 return me.parse(x, "." + i); | |
| 92 }); | |
| 93 me.leave(); | |
| 94 return v; | |
| 95 } else { | |
| 96 me.enter(name); | |
| 97 var result = {}; | |
| 98 for (var p in data) | |
| 99 result[p] = me.parse(data[p], "." + p); | |
| 100 me.leave(); | |
| 101 return result; | |
| 102 } | |
| 103 }, | |
| 104 | |
| 105 visit: function (id) { | |
| 106 var count = this._visited[id] || 0; | |
| 107 this._visited[id] = count + 1; | |
| 108 return count; | |
| 109 }, | |
| 110 | |
| 111 getStack: function () { | |
| 112 return this._stack.slice().reverse(); | |
| 113 }, | |
| 114 | |
| 115 enter: function (name, d, localize) { | |
| 116 if (this._trace) | |
| 117 trace.log("enter " + name + " " + (d || "") + | |
| 118 (localize ? " localize" : "")); | |
| 119 this._stack.push({ | |
| 120 name: name, | |
| 121 service: d, | |
| 122 scope: this._services | |
| 123 }); | |
| 124 if (localize) | |
| 125 this._services = Object.create(this._services); | |
| 126 }, | |
| 127 | |
| 128 leave: function () { | |
| 129 var ctx = this._stack.pop(); | |
| 130 this._services = ctx.scope; | |
| 131 | |
| 132 if (this._trace) | |
| 133 trace.log("leave " + ctx.name + " " + (ctx.service || "")); | |
| 134 } | |
| 135 }); | |
| 136 | |
| 137 return Context; | |
| 138 }); |
