peppermint-di
Dependency injection container for TypeScript and JavaScript.
This project was originally based on this blog post by Yusuf Aytas as it appeared in this StackOverflow question.
It has since evolved to support:
- TypeScript
- Singleton registration
- Interface registration
- Optional parameters
- and more...
Installation
yarn add peppermint-di
or
npm install --save peppermint-di
Short Example - TypeScript
import { Container, injectable } from 'peppermint-di';
class SomeService {
}
@injectable
class SomeClass {
constructor(someService: SomeService) {
}
}
const container = new Container();
container.registerSingle(SomeService)
const myClass = container.get(SomeClass);
Short Example - JavaScript
import { Container } from 'peppermint-di';
class SomeService {
}
class SomeClass {
constructor(someService) {
}
}
const container = new Container();
container.registerSingle('someService', SomeService);
const myClass = container.get(SomeClass);
More Examples
Interface Registration - TypeScript
import { Container, i, injectable } from 'peppermint-di';
interface ISomeService {
}
const ISomeService = Symbol('ISomeService');
class ConcreteSomeService implements ISomeService {
}
@injectable
class MyClass {
public myService: ISomeService;
constructor(@i(ISomeService) myService: ISomeService) {
this.myService = myService;
}
}
const container = new Container();
container.register(ISomeService, ConcreteSomeService);
const myClass = container.get(MyClass);
expect(myClass).to.be.instanceOf(MyClass);
expect(myClass.myService).to.be.instanceOf(ConcreteSomeService);
Custom parameters - TypeScript
import { Container, injectable } from 'peppermint-di';
class SomeService {
public name = 'default name';
}
@injectable
class MyClass {
public myService: SomeService;
constructor(myService: SomeService) {
this.myService = myService;
}
}
const container = new Container();
const customDep = new SomeService();
customDep.name = 'custom name';
const customParameters = { [SomeService.constructor.name]: customDep };
const myClass = container.get(MyClass, { params: customParameters });
expect(myClass.myService).to.be.instanceOf(SomeService);
expect(myClass.myService.name).to.eql('custom name');
Custom parameters - JavaScript
import { Container } from 'peppermint-di';
class SomeService {
public name = 'default name';
}
class MyClass {
public myService: SomeService;
constructor(myService: SomeService) {
this.myService = myService;
}
}
const container = new Container();
const customDep = new SomeService();
customDep.name = 'custom name';
const customParameters = { 'myService': customDep };
const myClass = container.get(MyClass, { params: customParameters });
expect(myClass.myService).to.be.instanceOf(SomeService);
expect(myClass.myService.name).to.eql('custom name');
API
You can find here a brief overview of the Container API.
For a more comprehensive review see the typing file.
You can also check out the library's unit tests as they contains examples for most use cases.
Container
Container key type:
type ContainerKey<T> = Constructor<T> | SimpleContainerKey;
type SimpleContainerKey = string | symbol;
Register a transient SomeService.
Container.register<T>(key: Constructor<T>, type?: Constructor<T>): void;
Container.register<T>(key: SimpleContainerKey, type: Constructor<T>): void;
Container.registerFactory<T>(key: ContainerKey<T>, factory: Factory<T>): void;
Register a singleton SomeService.
Container.registerSingle<T>(key: Constructor<T>, valueOrType?: T | Constructor<T>): void;
Container.registerSingle<T>(key: SimpleContainerKey, valueOrType: T | Constructor<T>): void;
Container.registerSingleFactory<T>(key: ContainerKey<T>, factory: Factory<T>): void;
Get an instance of T.
Container.get<T>(key: ContainerKey<T>, options?: ResolveOptions): T;
Resolve function arguments and call it.
Container.call(foo: Function, thisArg?: any, options?: ResolveOptions): any;
ResolveOptions
class ResolveOptions {
optionalParameters?: boolean;
constructUnregistered?: boolean;
params?: IDictionary<any>;
}
Changelog
The change log can be found here.