Commit fbea420

mo khan <mo@mokhan.ca>
2016-12-09 04:04:25
merge build into resolve and handle singletons.
1 parent a97ea8c
Changed files (2)
app
infrastructure
app/infrastructure/__tests__/registry_spec.js
@@ -38,6 +38,27 @@ describe("Registry", () => {
       let result = subject.resolve('item')
       expect(result).toBe(subject.resolve('item'));
     });
+
+    it ("resolves the constructor dependencies", () => {
+      var item = new Item();
+      subject.register('item', () => item);
+      subject.register('dependent', Dependent);
+
+      let result = subject.resolve('dependent');
+      expect(result).toBeInstanceOf(Dependent);
+      expect(result.item).toEqual(item);
+    })
+
+    it ("resolves constructor dependencies for a singleton", function() {
+      var item = new Item();
+      subject.register('item', () => item);
+      subject.register('dependent', Dependent).asSingleton();
+
+      let result = subject.resolve('dependent');
+      let other = subject.resolve('dependent');
+
+      expect(result).toBe(other);
+    });
   });
 
   describe("#resolveAll", () => {
@@ -53,17 +74,4 @@ describe("Registry", () => {
       expect(results[1]).toEqual("1");
     });
   });
-
-
-  describe("#build", () => {
-    it ("resolves the constructor dependencies", () => {
-      var item = new Item();
-      subject.register('item', () => item);
-      subject.register('dependent', Dependent);
-
-      let result = subject.build('dependent');
-      expect(result).toBeInstanceOf(Dependent);
-      expect(result.item).toEqual(item);
-    });
-  });
 });
app/infrastructure/registry.js
@@ -1,10 +1,9 @@
-export class Registration {
-  constructor(key, factory) {
-    this.key = key;
+export class Resolver {
+  constructor(factory) {
     this.factory = factory;
   }
 
-  create(container) {
+  resolveWith(container) {
     if (this.isConstructor()) {
       return this.resolveDependenciesUsing(container);
     }
@@ -13,17 +12,6 @@ export class Registration {
     }
   }
 
-  asSingleton() {
-    let originalFactory = this.factory;
-    let item = null;
-    this.factory = (container) => {
-      if (item == null) {
-        item = originalFactory(container);
-      }
-      return item;
-    };
-  }
-
   parseConstructor(item) {
     let code = item.toString();
     let regex = /function ([a-zA-Z]*)\((.*)\)\{/;
@@ -41,6 +29,28 @@ export class Registration {
   }
 }
 
+export class Registration {
+  constructor(key, factory) {
+    this.key = key;
+    this.factory = factory;
+  }
+
+  create(container) {
+    return new Resolver(this.factory).resolveWith(container);
+  }
+
+  asSingleton() {
+    let originalFactory = this.factory;
+    let item = null;
+    this.factory = (container) => {
+      if (item == null) {
+        item = new Resolver(originalFactory).resolveWith(container);
+      }
+      return item;
+    };
+  }
+}
+
 export default class Registry {
   constructor() {
     this.registrations = {};
@@ -62,8 +72,4 @@ export default class Registry {
   resolveAll(key) {
     return this.registrations[key].map(registration => registration.create(this));
   }
-
-  build(key) {
-    return this.registrations[key][0].create(this);
-  }
 }