From 9a762c5baa7cfa8243502da1d9622c4f17d598d7 Mon Sep 17 00:00:00 2001 From: Giovanni Carnel Date: Fri, 11 Apr 2014 15:42:56 +0200 Subject: [PATCH 1/2] injects into returned instance when mapped with toType --- public/js/InjectionMapping.js | 6 ++++-- public/js/Injector.js | 2 +- spec/javascripts/injectorSpec.js | 11 +++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/public/js/InjectionMapping.js b/public/js/InjectionMapping.js index fc71c0a..9a5a46e 100644 --- a/public/js/InjectionMapping.js +++ b/public/js/InjectionMapping.js @@ -41,7 +41,7 @@ injector.InjectionMapping.prototype = { this.toValue(new type()); }, - getValue: function() { + getValue: function(injector) { if(!this._isValid()) { throw new Error("Could not get value for "+this._id+" because the mapping is invalid"); return; @@ -50,7 +50,9 @@ injector.InjectionMapping.prototype = { if(this._value!=null) { return this._value; } else if(this._toType!=null) { - return new this._toType(); + var value = new this._toType(); + injector.injectInto(value); + return value; } } }; \ No newline at end of file diff --git a/public/js/Injector.js b/public/js/Injector.js index 82bcae6..370113f 100644 --- a/public/js/Injector.js +++ b/public/js/Injector.js @@ -71,7 +71,7 @@ injector.Injector.prototype = { getInstance: function(type, name) { if(this.hasMapping(type, name)) { - return this.getMapping(type, name).getValue(); + return this.getMapping(type, name).getValue(this); } else { var nameError = name == undefined ? "" : " by name "+ name; throw new Error("Cannot return instance \"" + type + nameError + "\" because no mapping has been found"); diff --git a/spec/javascripts/injectorSpec.js b/spec/javascripts/injectorSpec.js index f46905f..3031567 100644 --- a/spec/javascripts/injectorSpec.js +++ b/spec/javascripts/injectorSpec.js @@ -206,6 +206,17 @@ describe("Injector", function() { expect(function() {injector.getInstance('someValue2')}).toThrow(new Error('Cannot return instance "someValue2" because no mapping has been found')); }); + it("injects into returned instance when mapped with toType", function() { + var someValue = 'someValueToInject'; + var SomeObject = function() { + this.someValue = 'inject'; + }; + injector.map('someValue').toValue(someValue); + injector.map('SomeObject').toType(SomeObject); + expect(injector.getInstance('SomeObject').someValue).toBe(someValue); + }); + + describe("childInjector", function() { it("defaults to null when it was not instantiated by a parent", function() { From 4a3e36def5fe1753aacc5e0225f767695c2f61b2 Mon Sep 17 00:00:00 2001 From: Giovanni Carnel Date: Fri, 11 Apr 2014 17:18:57 +0200 Subject: [PATCH 2/2] inject into the singleton, singleton instantiation on demand --- public/js/InjectionMapping.js | 7 ++++++- spec/javascripts/injectorSpec.js | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/public/js/InjectionMapping.js b/public/js/InjectionMapping.js index 9a5a46e..b1d31e9 100644 --- a/public/js/InjectionMapping.js +++ b/public/js/InjectionMapping.js @@ -5,6 +5,7 @@ injector.InjectionMapping = function(type, name, id) { this._value = null; this._toType = null; + this._isSingleton = false; this._isValid = function() { return this._value!=null || this._toType!=null; @@ -38,7 +39,8 @@ injector.InjectionMapping.prototype = { }, toSingleton: function(type) { - this.toValue(new type()); + this.toType(type); + this._isSingleton = true; }, getValue: function(injector) { @@ -52,6 +54,9 @@ injector.InjectionMapping.prototype = { } else if(this._toType!=null) { var value = new this._toType(); injector.injectInto(value); + if(this._isSingleton) { + this._value = value; + } return value; } } diff --git a/spec/javascripts/injectorSpec.js b/spec/javascripts/injectorSpec.js index 3031567..4b8a684 100644 --- a/spec/javascripts/injectorSpec.js +++ b/spec/javascripts/injectorSpec.js @@ -216,6 +216,26 @@ describe("Injector", function() { expect(injector.getInstance('SomeObject').someValue).toBe(someValue); }); + it("injects into returned instance when mapped with toSingleton", function() { + var someValue = 'someValueToInject'; + var SomeObject = function() { + this.someValue = 'inject'; + }; + injector.map('someValue').toValue(someValue); + injector.map('SomeObject').toSingleton(SomeObject); + expect(injector.getInstance('SomeObject').someValue).toBe(someValue); + }); + + it("instantiates the singleton on demand", function() { + var someValue = 'someValueToInject'; + var SomeObject = function() { + this.someValue = 'inject'; + }; + injector.map('SomeObject').toSingleton(SomeObject); + injector.map('someValue').toValue(someValue); + expect(injector.getInstance('SomeObject').someValue).toBe(someValue); + }); + describe("childInjector", function() {