go-di - Dependency injection in JavaScript

Install
npm i go-di
Supports
-
Service types
-
Service lifetimes
- Singleton
- Transient
- Scoped
-
Decorators
@injectable for class
@serviceName for property
-
Misc
- Middleware for service initialization
Usage
Decorators
import { injectable, createService, ServiceCollection } from "go-di";
const collection = new ServiceCollection();
const provider = collection.getProvider();
class ServiceA {
a = 1
}
const serviceA = createService<ServiceA>();
@injectable
class ServiceB {
@serviceA() a!: ServiceA;
}
const serviceB = createService<ServiceB>();
collection
.addClass(serviceA, ServiceA)
.addClass(serviceB, ServiceB);
console.log(serviceB(provider).a.a);
Lifetime
import { createService, ServiceCollection } from "go-di";
const collection = new ServiceCollection();
const provider = collection.getProvider();
const serviceA = createService<typeof myServiceA>();
const serviceB = createService<typeof myServiceB>();
const serviceС = createService<typeof myServiceC>();
let serviceACounter = 0;
function myServiceA() {
return serviceACounter++;
}
let serviceBCounter = 0;
function myServiceB() {
return serviceBCounter++;
}
let serviceCCounter = 0;
function myServiceC() {
return serviceCCounter++;
}
collection
.addFunction(serviceA, myServiceA, ServiceType.Transient)
.addFunction(serviceB, myServiceB, ServiceType.Singleton)
.addFunction(serviceС, myServiceC, ServiceType.Scoped);
console.log(serviceA(provider), serviceACounter)
console.log(serviceA(provider), serviceACounter)
console.log(serviceB(provider), serviceBCounter)
console.log(serviceB(provider), serviceBCounter)
console.log(serviceC(provider), serviceCCounter)
const scopeA = provider.createScope();
console.log(serviceC(scopeA), serviceCCounter)
console.log(serviceC(scopeA), serviceCCounter)
const scopeB = provider.createScope();
console.log(serviceC(scopeB), serviceCCounter)
console.log(serviceC(scopeB), serviceCCounter)
console.log(serviceC(scopeA), serviceCCounter)
console.log(serviceC(scopeB), serviceCCounter)
Hierarchical scope
import { createService, ServiceCollection } from "go-di";
const collection = new ServiceCollection();
const secondCollection = new ServiceCollection();
const provider = collection.getProvider();
const scope = provider.createScope(secondCollection);
const serviceA = createService<typeof myServiceA>();
const serviceB = createService<typeof myServiceB>();
const serviceС = createService<typeof myServiceC>();
let serviceACounter = 0;
function myServiceA() {
return serviceACounter++;
}
let serviceBCounter = 0;
function myServiceB() {
return serviceBCounter++;
}
let serviceCCounter = 0;
function myServiceC() {
return serviceCCounter++;
}
collection
.addFunction(serviceA, myServiceA, ServiceType.Transient)
.addFunction(serviceB, myServiceB, ServiceType.Singleton);
secondCollection.addFunction(serviceС, myServiceC, ServiceType.Scoped);
console.log(serviceA(provider), serviceACounter)
console.log(serviceA(provider), serviceACounter)
console.log(serviceB(provider), serviceBCounter)
console.log(serviceB(provider), serviceBCounter)
console.log(serviceC(provider), serviceCCounter)
console.log(serviceC(scope), serviceCCounter)
console.log(serviceC(scope), serviceCCounter)
console.log(serviceA(scope), serviceACounter)
console.log(serviceA(scope), serviceACounter)
console.log(serviceB(scope), serviceBCounter)
console.log(serviceB(scope), serviceBCounter)
useMiddleware
import { createService, ServiceCollection } from "go-di";
const collection = new ServiceCollection();
const provider = collection
.getProvider(pipe => pipe.addMiddleware((descriptor, provider, value, args)=> {
function getValue(descriptor, args) {
const _value = value(descriptor, args);
console.log(`${descriptor.name}(${args}) => ${_value}`)
}
return getValue;
}));
const serviceA = createService<number>('serviceA');
const serviceB = createService<number>('serviceB');
const serviceС = createService<typeof myService>();
function myService(arg) {}
collection
.addObject(serviceA, 1)
.addObject(serviceB, 2)
.addFunction(serviceС, myService);
serviceA(provider);
serviceB(provider);
serviceC(provider, "argument");