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