Skip to content

Commit 82f016a

Browse files
committed
feat(container): add self registration of container in constructor, test, and document it
1 parent e49966e commit 82f016a

File tree

6 files changed

+57
-5
lines changed

6 files changed

+57
-5
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Container, TContainer, Injectable } from 'container-ioc';
2+
3+
const container = new Container();
4+
5+
@Injectable([TContainer])
6+
class Builder {
7+
constructor(container) {}
8+
}
9+
10+
container.register({ token: Builder, useClass: Builder });
11+
12+
const builder = container.resolve(Builder);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { IContainer, Container, TContainer, Injectable, Inject } from 'container-ioc';
2+
3+
const container = new Container();
4+
5+
@Injectable()
6+
class Builder {
7+
constructor(@Inject(TContainer) private container: IContainer) {}
8+
}
9+
10+
container.register({ token: Builder, useClass: Builder });
11+
12+
const builder = container.resolve(Builder);

src/lib/container.interface.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ export interface IContainerOptions {
66
}
77

88
export interface IContainer {
9+
[key: string]: any;
10+
911
register(provider: RegistrationProvider|RegistrationProvider[]): void;
1012

1113
resolve(token: ProviderToken): IInjectionInstance;
@@ -18,4 +20,6 @@ export interface IContainer {
1820
createChild(): IContainer;
1921

2022
setParent(parent: IContainer): void;
21-
}
23+
}
24+
25+
export const TContainer = Symbol('IContainer');

src/lib/container.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { IConstructor, IInjectionInstance, IInjectionMd, IProvider, LifeTime, ProviderToken, RegistrationProvider } from './interfaces';
22
import { FactoryFunction, IFactory, IRegistryData, RegistryData } from './registry-data';
3-
import { IContainer, IContainerOptions } from './container.interface';
3+
import { IContainer, IContainerOptions, TContainer } from './container.interface';
44
import { ClassNotInjectableError, InvalidProviderProvidedError, NoProviderError } from './exceptions';
55
import { INJECTABLE_MD_KEY, INJECTIONS_MD_KEY } from './metadata/keys';
66
import { IMetadataAnnotator } from './metadata/metadata-annotator.interface';
@@ -21,6 +21,7 @@ export class Container implements IContainer {
2121
this.parent = <IContainer> options.parent;
2222
this.defaultLifeTime = options.defaultLifeTime || this.defaultLifeTime;
2323
}
24+
this.register({ token: TContainer, useValue: this });
2425
}
2526

2627
public register(provider: RegistrationProvider|RegistrationProvider[]): void {

src/lib/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export { Container } from './container';
2-
export { IContainer } from './container.interface';
2+
export { IContainer, TContainer } from './container.interface';
33
export { Inject, Injectable } from './decorators';
44
export { InjectionToken } from './injection-token';
55
export { IMetadataAnnotator } from './metadata/metadata-annotator.interface';

src/tests/container.spec.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { IContainer } from '../lib/container.interface';
1+
import { IContainer, TContainer } from '../lib/container.interface';
22
import { Container } from '../lib/index';
33

44
import 'mocha';
@@ -356,6 +356,21 @@ describe('Container', () => {
356356

357357
expect(throwableFunc).to.throw('No provider for IB. Trace: IA --> IB');
358358
});
359+
360+
it('should resolve container instance when injected into class Literal', () => {
361+
// arrange
362+
@Injectable()
363+
class TestClass {
364+
constructor(@Inject(TContainer) public a: IContainer) {}
365+
}
366+
container.register({ token: TestClass, useClass: TestClass });
367+
// act
368+
const actual = container.resolve(TestClass);
369+
// assert
370+
expect(actual).to.be.ok;
371+
expect(actual.a).to.be.ok;
372+
expect(actual.a).to.equal(container);
373+
});
359374
});
360375

361376
describe('Hierarchial', () => {
@@ -449,6 +464,14 @@ describe('Container', () => {
449464

450465
expect(instance1).not.to.be.equal(instance2);
451466
});
467+
468+
it('should register itself for injection', () => {
469+
// arrange, act
470+
const actual = container.resolve(TContainer);
471+
// assert
472+
expect(actual).to.be.ok;
473+
expect(actual).to.equal(container);
474+
});
452475
});
453476

454477
describe('createChild()', () => {
@@ -471,5 +494,5 @@ describe('Container', () => {
471494

472495
expect(value).to.be.equal('string');
473496
});
474-
});
497+
});
475498
});

0 commit comments

Comments
 (0)