1.1.1 • Published 7 years ago
@slicky/di v1.1.1
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();