comparison src/implab/di/ReferenceDescriptor.js @ 34:27e8e9e38e07 default tip

Слияние
author nickolay
date Wed, 05 Jun 2019 20:44:15 +0300
parents 8af8e840dd49 1dc2fd263b90
children
comparison
equal deleted inserted replaced
33:8af8e840dd49 34:27e8e9e38e07
1 define([
2 "../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 });