diff options
| author | mo khan <mo@mokhan.ca> | 2016-12-08 20:57:26 -0700 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2016-12-08 20:57:26 -0700 |
| commit | a97ea8c81e8cdc459e98d92b88f2191b285a0e2d (patch) | |
| tree | c1a124d615aab839b649323959642b58f6a54087 | |
| parent | 16d903a5c24efca50405817a890eed4976cd8055 (diff) | |
implement build method to automatically resolve dependencies.
| -rw-r--r-- | app/infrastructure/__tests__/registry_spec.js | 27 | ||||
| -rw-r--r-- | app/infrastructure/registry.js | 29 |
2 files changed, 47 insertions, 9 deletions
diff --git a/app/infrastructure/__tests__/registry_spec.js b/app/infrastructure/__tests__/registry_spec.js index 256d98f..da7a4f9 100644 --- a/app/infrastructure/__tests__/registry_spec.js +++ b/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); + }); + }); }); diff --git a/app/infrastructure/registry.js b/app/infrastructure/registry.js index 63e8159..43dc794 100644 --- a/app/infrastructure/registry.js +++ b/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); + } } |
