Mercurial > pub > ImplabJs
comparison src/implab/di/ReferenceDescriptor.js @ 0:fc2517695ee1
Initial commit, draft import of existing work
author | cin |
---|---|
date | Thu, 01 Jun 2017 13:20:03 +0300 |
parents | |
children | 93fb6c09f2e1 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:fc2517695ee1 |
---|---|
1 define([ | |
2 "dojo/_base/declare", "../safe", "./Descriptor", "./ActivationError", "./ValueDescriptor" | |
3 ], | |
4 | |
5 function(declare, safe, Descriptor, ActivationError, Value) { | |
6 return declare(Descriptor, { | |
7 _name : null, | |
8 _lazy : false, | |
9 _optional : false, | |
10 _default : undefined, | |
11 | |
12 constructor : function(name, lazy, optional, def, services) { | |
13 safe.argumentNotEmptyString(name, "name"); | |
14 this._name = name; | |
15 this._lazy = Boolean(lazy); | |
16 this._optional = Boolean(optional); | |
17 this._default = def; | |
18 this._services = services; | |
19 }, | |
20 | |
21 activate : function(context, name) { | |
22 var me = this; | |
23 | |
24 context.enter(name, this, true); | |
25 | |
26 // добавляем сервисы | |
27 if (me._services) { | |
28 for ( var p in me._services) { | |
29 var sv = me._services[p]; | |
30 context.register(p, sv instanceof Descriptor ? sv : new Value(sv, false)); | |
31 } | |
32 } | |
33 | |
34 if (me._lazy) { | |
35 // сохраняем контекст активации | |
36 context = context.clone(); | |
37 return function(cfg) { | |
38 // защищаем контекст на случай исключения в процессе | |
39 // активации | |
40 var ct = context.clone(); | |
41 try { | |
42 if (cfg) | |
43 safe.each(cfg, function(v, k) { | |
44 ct.register(k, v instanceof Descriptor ? v : new Value(v, false)); | |
45 }); | |
46 return me._optional ? ct.getService(me._name, me._default) : ct | |
47 .getService(me._name); | |
48 } catch (error) { | |
49 throw new ActivationError(me._name, ct.getStack(), error); | |
50 } | |
51 }; | |
52 } | |
53 | |
54 var v = me._optional ? context.getService(me._name, me._default) : context | |
55 .getService(me._name); | |
56 context.leave(me); | |
57 return v; | |
58 }, | |
59 | |
60 isInstanceCreated : function() { | |
61 return false; | |
62 }, | |
63 | |
64 toString : function() { | |
65 var opts = []; | |
66 if (this._optional) | |
67 opts.push("optional"); | |
68 if (this._lazy) | |
69 opts.push("lazy"); | |
70 | |
71 var parts = [ | |
72 "@ref " | |
73 ]; | |
74 if (opts.length) { | |
75 parts.push("{"); | |
76 parts.push(opts.join()); | |
77 parts.push("} "); | |
78 } | |
79 | |
80 parts.push(this._name); | |
81 | |
82 if (!safe.isNull(this._default)) { | |
83 parts.push(" = "); | |
84 parts.push(this._default); | |
85 } | |
86 | |
87 return parts.join(""); | |
88 } | |
89 }); | |
90 }); |