Commit 9f5a458

mo khan <mo@mokhan.ca>
2016-12-06 01:45:26
register singleton instances.
1 parent e8f01a0
Changed files (2)
app
infrastructure
app/infrastructure/__tests__/container_spec.js
@@ -31,5 +31,12 @@ describe("Container", () => {
       expect(result).toBeInstanceOf(Dependent);
       expect(result.item).toBeInstanceOf(Item);
     });
+
+    it ("can resolve a singleton", () => {
+      subject.register('item', () => { return new Item() }).asSingleton();
+
+      result = subject.resolve('item')
+      expect(result).toBe(subject.resolve('item'));
+    });
   });
 });
app/infrastructure/container.js
@@ -1,13 +1,35 @@
+class Registration {
+  constructor(key, factory) {
+    this.key = key;
+    this.factory = factory;
+  }
+
+  create(container) {
+    return this.factory(container);
+  }
+
+  asSingleton() {
+    let originalFactory = this.factory;
+    let item = null;
+    this.factory = (container) => {
+      if (item == null) {
+        item = originalFactory(container);
+      }
+      return item;
+    };
+  }
+}
+
 export default class Container {
   constructor() {
     this.components = {};
   }
 
   register(key, factory) {
-    this.components[key] = factory;
+    return this.components[key] = new Registration(key, factory)
   }
 
   resolve(key) {
-    return this.components[key](this);
+    return this.components[key].create(this);
   }
 }