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