Commit a97ea8c
Changed files (2)
app
infrastructure
__tests__
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);
+ }
}