typedi
Version:
Dependency injection for Typescript
236 lines (165 loc) • 5.16 kB
Markdown
# TypeDI
Dependency injection tool for Typescript.
## Installation
1. Install module:
`npm install typedi --save`
2. Use [typings](https://github.com/typings/typings) to install all required definition dependencies.
`typings install`
3. ES6 features are used, so you may want to install [es6-shim](https://github.com/paulmillr/es6-shim) too. You also
need to install [reflect-metadata](https://www.npmjs.com/package/reflect-metadata) package.
`npm install es6-shim --save`
`npm install reflect-metadata --save`
if you are building nodejs app, you may want to `require("es6-shim");` and `require("reflect-metadata")` in your app.
## Usage
If you simply want to use a container:
```javascript
import {Container} from "typedi";
class SomeClass {
someMethod() {
}
}
let someClass = Container.get(SomeClass);
someClass.someMethod();
```
If you want to inject other classes into your service you can do:
```javascript
import {Container, Inject} from "typedi";
class BeanFactory {
create() {
}
}
class SugarFactory {
create() {
}
}
class WaterFactory {
create() {
}
}
class CoffeeMaker {
beanFactory: BeanFactory;
sugarFactory: SugarFactory;
waterFactory: WaterFactory;
make() {
this.beanFactory.create();
this.sugarFactory.create();
this.waterFactory.create();
}
}
let coffeeMaker = Container.get(CoffeeMaker);
coffeeMaker.make();
```
If you want to use constructor injection:
```javascript
import {Container, Service} from "typedi";
class BeanFactory {
create() {
}
}
class SugarFactory {
create() {
}
}
class WaterFactory {
create() {
}
}
class CoffeeMaker {
private beanFactory: BeanFactory;
private sugarFactory: SugarFactory;
private waterFactory: WaterFactory;
constructor(beanFactory: BeanFactory, sugarFactory: SugarFactory, waterFactory: WaterFactory) {
this.beanFactory = beanFactory;
this.sugarFactory = sugarFactory;
this.waterFactory = waterFactory;
}
make() {
this.beanFactory.create();
this.sugarFactory.create();
this.waterFactory.create();
}
}
let coffeeMaker = Container.get(CoffeeMaker);
coffeeMaker.make();
```
> note: Your classes may not to have `` decorator to use it with Container, however its recommended to add
`` decorator to all classes you are using with container, especially if you class injects other
services
### Extra feature: Injecting third-party dependencies *(experimental)*
Also you can inject a modules that you want to `require`:
```javascript
import {Container, Service, Require} from "typedi";
class CoffeeMaker {
private gulp: any; // you can use type if you have definition for this package
constructor( gulp: any) {
this.gulp = gulp; // the same if you do this.gulp = require("gulp")
}
make() {
console.log(this.gulp); // here you get console.logged gulp package =)
}
}
let coffeeMaker = Container.get(CoffeeMaker);
coffeeMaker.make();
```
### Named services
You can use a named services. In this case you can use interface-based services.
```javascript
import {Container, Service, Inject} from "typedi";
interface Factory {
create(): void;
}
class BeanFactory implements Factory {
create() {
}
}
class SugarFactory implements Factory {
create() {
}
}
class WaterFactory implements Factory {
create() {
}
}
class CoffeeMaker {
beanFactory: Factory;
sugarFactory: Factory;
waterFactory: Factory;
constructor( beanFactory: BeanFactory,
sugarFactory: SugarFactory) {
this.beanFactory = beanFactory;
this.sugarFactory = sugarFactory;
}
make() {
this.beanFactory.create();
this.sugarFactory.create();
this.waterFactory.create();
}
}
let coffeeMaker = Container.get<CoffeeMaker>("coffee.maker");
coffeeMaker.make();
```
### Providing values to the container
If you are writing unit tests for you class, you may want to provide fakes to your classes. You can use `set` or
`provide` methods of the container:
```javascript
Container.set(CoffeeMaker, new FakeCoffeeMaker());
// or alternatively:
Container.provide([
{ name: "bean.factory", type: BeanFactory, value: new FakeBeanFactory() },
{ name: "sugar.factory", type: SugarFactory, value: new FakeSugarFactory() },
{ name: "water.factory", type: WaterFactory, value: new FakeWaterFactory() }
]);
```
## Samples
Take a look on samples in [./sample](https://github.com/pleerock/typedi/tree/master/sample) for more examples of
usages.