Commit a97ea8c

mo khan <mo@mokhan.ca>
2016-12-09 03:57:26
implement build method to automatically resolve dependencies.
1 parent 16d903a
Changed files (2)
app
infrastructure
app/infrastructure/__tests__/registry_spec.js
@@ -1,6 +1,13 @@
 import Registry from '../registry';
 
 describe("Registry", () => {
+  class Item { }
+  class Dependent {
+    constructor(item) {
+      this.item = item;
+    }
+  }
+
   let subject = null;
 
   beforeEach(() => {
@@ -8,13 +15,6 @@ describe("Registry", () => {
   });
 
   describe("#resolve", () => {
-    class Item { }
-    class Dependent {
-      constructor(item) {
-        this.item = item;
-      }
-    }
-
     it("can resolve an instance", () => {
       subject.register('item', () => { return new Item() })
 
@@ -53,4 +53,17 @@ 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,11 +1,16 @@
-class Registration {
+export class Registration {
   constructor(key, factory) {
     this.key = key;
     this.factory = factory;
   }
 
   create(container) {
-    return this.factory(container);
+    if (this.isConstructor()) {
+      return this.resolveDependenciesUsing(container);
+    }
+    else {
+      return this.factory(container);
+    }
   }
 
   asSingleton() {
@@ -18,6 +23,22 @@ class Registration {
       return item;
     };
   }
+
+  parseConstructor(item) {
+    let code = item.toString();
+    let regex = /function ([a-zA-Z]*)\((.*)\)\{/;
+    return code.match(regex);
+  }
+
+  isConstructor() {
+    return this.parseConstructor(this.factory)[1] != '';
+  }
+
+  resolveDependenciesUsing(container) {
+    let parameters = this.parseConstructor(this.factory).slice(2);
+    let dependencies = parameters.map((parameter) => container.resolve(parameter));
+    return new this.factory(...dependencies);
+  }
 }
 
 export default class Registry {
@@ -41,4 +62,8 @@ export default class Registry {
   resolveAll(key) {
     return this.registrations[key].map(registration => registration.create(this));
   }
+
+  build(key) {
+    return this.registrations[key][0].create(this);
+  }
 }