Yet another di container for javascript/typescript
npm i -S @microphi/di
or yarn add @microphi/di
Decorate a class with @Injectable()
.
// my-class.ts
import { Injectable } from '@microphi/di';
@Injectable()
class MyClass {
public sayHello(name: string) {
return `Hello ${name}`;
}
}
Inject it using @Inject(<Class>)
// consumer.ts
import { Inject } from '@microphi/di';
class Consumer {
constructor(
@Inject(MyClass) public myClassSingleton: MyClass
) {
this.myClassSingleton.sayHello('consumer');
}
}
Getting a singleton programmatically
// my-script.ts
const singleton = injector(MyClass);
Create the app
@DI({
providers: [
MyClass,
]
})
class App {
}
const app = bootstrap(App);
providers
array also accept an object such as:
@DI({
providers: [
{
provide: MyClass,
useClass: MyCustomImplementation,
},
]
})
class App {
}
const app = bootstrap(App);
In order to test a singleton and mock dependencies use TestBed
import { Inject } from '@microphi/di';
describe('MyClass', () => {
@Injectable()
class HttpService {
}
@Injectable()
class TestClass {
constructor(
@Inject(HttpService) http: HttpService,
) {
}
}
let instance;
beforeEach(() => {
TestBed.configure({
providers: [
TestClass,
{
provide: HttpService,
useClass: class {
// test implementation
}
}
]
});
instance = TestBed.inject(TestClass);
});
it('should exist', () => {
expect(instance).toBeTruthy();
});
});
Only if jest is used the Mocked
utility can be used to automatically mock any given class.
import { Inject } from '@microphi/di';
describe('MyClass', () => {
@Injectable()
class HttpService {
}
@Injectable()
class TestClass {
constructor(
@Inject(HttpService) http: HttpService,
) {
}
}
let instance;
beforeEach(() => {
TestBed.configure({
providers: [
TestClass,
{
provide: HttpService,
useClass: Mocked(HttpService)
}
]
});
instance = TestBed.inject(TestClass);
});
it('should exist', () => {
expect(instance).toBeTruthy();
});
});
for more info look at its tests
Prepend DEBUG=microgamma:digator*
to your script to see debugging information.