提交 04239c5a 编写于 作者: J Johannes Rieken

debt - remove unused injector

上级 1eaa90ed
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import Assert = require('vs/base/common/assert');
import Types = require('vs/base/common/types');
var inject = 'inject';
var injectLen = inject.length;
export class Container {
private map:{[name:string]:any;};
private parent:Container;
constructor() {
this.map = {};
this.parent = null;
}
public setParent(parent:Container):void {
this.parent = parent;
}
public registerService(target:string, service:any):any {
Assert.ok(!Types.isUndefinedOrNull(target));
Assert.ok(!Types.isUndefinedOrNull(service));
this.map[target.toLowerCase()] = service;
return service;
}
// injects the denoted services to the target
public injectTo(target:any):boolean {
Assert.ok(!Types.isUndefinedOrNull(target));
// Support arrays
var didInjectAtLeastOnce = false;
if (Types.isArray(target)) {
target.forEach((element:any) => {
didInjectAtLeastOnce = this.injectTo(element) || didInjectAtLeastOnce;
});
return didInjectAtLeastOnce;
}
// inject services one by one
for (var key in target) {
if(key.indexOf(inject) !== 0) {
continue;
}
var element = target[key];
if(!Types.isFunction(element)) {
continue;
}
key = key.substring(injectLen).toLowerCase();
var service = this.findService(key, target);
if(Types.isUndefinedOrNull(service)) {
continue;
}
// call inject function
element.apply(target, [service]);
didInjectAtLeastOnce = true;
}
return didInjectAtLeastOnce;
}
public createChild():Container {
var childContainer = new Container();
childContainer.setParent(this);
return childContainer;
}
public findService(key:string, target:any=null):any {
var result = this.map[key];
if((Types.isUndefinedOrNull(result) || target === result) && this.parent !== null) {
result = this.parent.findService(key, target);
}
return result;
}
public dispose():void {
this.map = null;
this.parent = null;
}
}
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as assert from 'assert';
import injector = require('vs/base/common/injector');
suite('Injection test', () => {
test('test inject service', function() {
var didInjectFoo = false;
var didInjectBar = false;
var checkCount = 0;
var target = {
_serviceFoo: null,
_serviceBar: null,
injectFoo: function(service) {
this._serviceFoo = service;
didInjectFoo = true;
},
injectBar: function(s) {
this._serviceBar = s;
didInjectBar = true;
},
check: function() {
this._serviceFoo.check();
this._serviceBar.check();
}
}
var service = {
check: function() {
checkCount++;
}
};
var container = new injector.Container();
container.registerService('foo', service);
container.registerService('bar', service);
container.injectTo(target);
target.check();
assert(didInjectFoo);
assert(didInjectBar);
assert.equal(checkCount, 2);
});
test('test inject service with chaining', function() {
var didDoubleInjectFoo = false;
var target = {
_serviceFoo: null,
_serviceBar: null,
injectFoo: function(service) {
this._serviceFoo = service;
},
injectBar: function(s) {
this._serviceBar = s;
},
check: function() {
this._serviceFoo.check();
this._serviceBar.check();
}
};
var service = {
check: function() {}
};
var service1 = {
check: function() {
didDoubleInjectFoo = true;
}
};
var container = new injector.Container();
container.registerService('foo', service);
var container1 = new injector.Container();
container1.registerService('bar', service);
container1.registerService('foo', service1); // will be ignored
container.setParent(container1);
container.injectTo(target);
target.check();
assert(!didDoubleInjectFoo);
});
test('inject does not inject target with target', function() {
var target = {
injectFoo: function(s) {
assert(target !== s);
}
};
var service = { };
var parent = new injector.Container();
parent.registerService('foo', parent);
var container = parent.createChild();
container.registerService('foo', target);
container.injectTo(target);
});
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册