Mercurial > pub > ImplabJs
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/implab/di/ReferenceDescriptor.js Thu Jun 01 13:20:03 2017 +0300 @@ -0,0 +1,90 @@ +define([ + "dojo/_base/declare", "../safe", "./Descriptor", "./ActivationError", "./ValueDescriptor" +], + +function(declare, safe, Descriptor, ActivationError, Value) { + return declare(Descriptor, { + _name : null, + _lazy : false, + _optional : false, + _default : undefined, + + constructor : function(name, lazy, optional, def, services) { + safe.argumentNotEmptyString(name, "name"); + this._name = name; + this._lazy = Boolean(lazy); + this._optional = Boolean(optional); + this._default = def; + this._services = services; + }, + + activate : function(context, name) { + var me = this; + + context.enter(name, this, true); + + // добавляем сервисы + if (me._services) { + for ( var p in me._services) { + var sv = me._services[p]; + context.register(p, sv instanceof Descriptor ? sv : new Value(sv, false)); + } + } + + if (me._lazy) { + // сохраняем контекст активации + context = context.clone(); + return function(cfg) { + // защищаем контекст на случай исключения в процессе + // активации + var ct = context.clone(); + try { + if (cfg) + safe.each(cfg, function(v, k) { + ct.register(k, v instanceof Descriptor ? v : new Value(v, false)); + }); + return me._optional ? ct.getService(me._name, me._default) : ct + .getService(me._name); + } catch (error) { + throw new ActivationError(me._name, ct.getStack(), error); + } + }; + } + + var v = me._optional ? context.getService(me._name, me._default) : context + .getService(me._name); + context.leave(me); + return v; + }, + + isInstanceCreated : function() { + return false; + }, + + toString : function() { + var opts = []; + if (this._optional) + opts.push("optional"); + if (this._lazy) + opts.push("lazy"); + + var parts = [ + "@ref " + ]; + if (opts.length) { + parts.push("{"); + parts.push(opts.join()); + parts.push("} "); + } + + parts.push(this._name); + + if (!safe.isNull(this._default)) { + parts.push(" = "); + parts.push(this._default); + } + + return parts.join(""); + } + }); +}); \ No newline at end of file