1.1.1 • Published 7 years ago

@slicky/di v1.1.1

Weekly downloads
1
License
MIT
Repository
github
Last release
7 years ago

NPM version

Slicky/DI

Dependency injection for typescript

Installation

$ npm install @slicky/di

Import this code in your bootstrap file:

import 'reflect-metadata';

Basic usage

Every service in DI container is ordinary typescript class with @Injectable() annotation.

import {Container, Injectable} from '@slicky/di';

@Injectable()
class MyService
{
	
	hello()
	{
		console.log('hello');
	}
	
}

let container = new Container;
container.addService(MyService);

let service: MyService = container.get(MyService);
service.hello();

If your service depends on another service, it will be automatically autowired.

import {Container, Injectable} from '@slicky/di';

@Injectable()
class Logger
{
	
	log(message: string)
	{
		console.log(message);
	}
	
}

@Injectable()
class MyService
{
	
	constructor(private logger: Logger) {}
	
	hello()
	{
		this.logger.log('hello');
	}
	
}

let container = new Container;
container.addService(Logger);
container.addService(MyService);

let service: MyService = container.get(MyService);
service.hello();

Create instance without registering service

Next code will always create new instance of MyService.

import {Container, Injectable, Inject} from '@slicky/di';

@Injectable()
class Logger
{
	
	log(message: string)
	{
		console.log(message);
	}
	
}

class MyService
{
	
	constructor(@Inject() private logger: Logger) {}
	
	hello()
	{
		this.logger.log('hello');
	}
	
}

let container = new Container;
container.addService(Logger);

let service: MyService = container.create(MyService);
service.hello();

Value service

Useful for configuration options.

import {Container, Inject} from '@slicky/di';

class ValueService {}

class Application
{
	
	constructor(@Inject(ValueService) value: string)
	{
		console.log(value);		// output: "some value"
	}
	
}

let container = new Container;
container.addService(ValueService, {
	useValue: 'some value',
});

Factories

import {Container} from '@slicky/di';

class MyService {}

let container = new Container;
container.addService(MyService, {
	useFactory: () => new MyService,
});

Aliases

import {Container, Injectable} from '@slicky/di';

@Injectable()
class OldService {}
class MyService {}

let container = new Container;
container.addService(OldService);
container.addService(MyService, {
	useExisting: OldService,
});

Using different class

import {Container, Injectable} from '@slicky/di';

class MyService {}
class MyBetterService {}

let container = new Container;
container.addService(MyService, {
	useClass: MyBetterService,
});

Forking containers

You can simply create fork of current container with for example some overwritten services.

import {Container} from '@slicky/di';

let container = new Container;
let fork = container.fork();