diff --git a/examples/javascript/resolving-container.js b/examples/javascript/resolving-container.js new file mode 100644 index 0000000..b66392c --- /dev/null +++ b/examples/javascript/resolving-container.js @@ -0,0 +1,12 @@ +import { Container, Injectable } from 'container-ioc'; + +const container = new Container(); + +@Injectable([Container]) +class Builder { + constructor(container) {} +} + +container.register({ token: Builder, useClass: Builder }); + +const builder = container.resolve(Builder); \ No newline at end of file diff --git a/examples/typescript/resolving-container.ts b/examples/typescript/resolving-container.ts new file mode 100644 index 0000000..3a97cf1 --- /dev/null +++ b/examples/typescript/resolving-container.ts @@ -0,0 +1,12 @@ +import { IContainer, Container, Injectable, Inject } from 'container-ioc'; + +const container = new Container(); + +@Injectable() +class Builder { + constructor(@Inject(Container) private container: IContainer) {} +} + +container.register({ token: Builder, useClass: Builder }); + +const builder = container.resolve(Builder); \ No newline at end of file diff --git a/src/lib/container.interface.ts b/src/lib/container.interface.ts index 918f9f1..cf3b5f0 100644 --- a/src/lib/container.interface.ts +++ b/src/lib/container.interface.ts @@ -5,7 +5,7 @@ export interface IContainerOptions { defaultLifeTime?: LifeTime; } -export interface IContainer { +export interface IContainer { register(provider: RegistrationProvider|RegistrationProvider[]): void; resolve(token: ProviderToken): IInjectionInstance; diff --git a/src/lib/container.ts b/src/lib/container.ts index c0a0953..5faed28 100644 --- a/src/lib/container.ts +++ b/src/lib/container.ts @@ -21,6 +21,7 @@ export class Container implements IContainer { this.parent = options.parent; this.defaultLifeTime = options.defaultLifeTime || this.defaultLifeTime; } + this.register({ token: Container, useValue: this }); } public register(provider: RegistrationProvider|RegistrationProvider[]): void { diff --git a/src/tests/container.spec.ts b/src/tests/container.spec.ts index 8b8b27b..0024d94 100644 --- a/src/tests/container.spec.ts +++ b/src/tests/container.spec.ts @@ -356,6 +356,20 @@ describe('Container', () => { expect(throwableFunc).to.throw('No provider for IB. Trace: IA --> IB'); }); + + it('should resolve container instance when injected into class Literal', () => { + @Injectable() + class TestClass { + constructor(@Inject(Container) public a: IContainer) {} + } + + container.register({ token: TestClass, useClass: TestClass }); + const actual = container.resolve(TestClass); + + expect(actual).to.be.ok; + expect(actual.a).to.be.ok; + expect(actual.a).to.equal(container); + }); }); describe('Hierarchial', () => { @@ -449,6 +463,13 @@ describe('Container', () => { expect(instance1).not.to.be.equal(instance2); }); + + it('should register itself for injection', () => { + const actual = container.resolve(Container); + + expect(actual).to.be.ok; + expect(actual).to.equal(container); + }); }); describe('createChild()', () => { @@ -471,5 +492,5 @@ describe('Container', () => { expect(value).to.be.equal('string'); }); - }); + }); }); \ No newline at end of file