a simple library for dependency injection in node
npm install --save tiny-dependency-injection
// reporitories/UserReporitory.js
export default class UserReporitory {
/**
* @param {ExampleService} exampleService
*/
constructor(exampleService) {
this._exampleService = exampleService;
}
...
}
You can register this in the container as a service:
import {ContainerBuilder} from 'tiny-dependecy-injection'
import {UserReporitory} from './reporitories/UserReporitory.js'
import {ExampleService} from './services/ExampleService'
const container = new ContainerBuilder()
container.register('service.example', ExampleService)
container
.register('reporitories.ures-repository', UserReporitory)
// For the argument to return an instance of the service, the prefix '@' must be used,
// otherwise it will be taken as a string
.addArgument('@service.example')
And get services from your container
const reporitory = container.get('@reporitories.ures-repository')
You can also configure the scope of the service, by default it is scoped
container
.register('reporitories.ures-repository', UserReporitory)
.addArgument('@service.example')
.asSingleton()
or
container
.register('reporitories.ures-repository', UserReporitory)
.addArgument('@service.example')
.asScoped()
any type of arguments can be set
container
.register('reporitories.ures-repository', UserReporitory)
.addArgument('string')
.addArgument(true)
.addArgument({ environment: 'test' })
.addArgument('@service.example')
.addArgument(new ExampleService())
To use environment variables in arguments is done as follows;
container
.register('reporitories.ures-repository', UserReporitory)
.addArgument('$env(MY_VARIABLE)')
NOTE: If the variable does not exist, an error will be thrown.
factories can also be registered
//factories/ServiceFactory.js
import {ExampleService} from './services/ExampleService'
export default class ServiceFactory {
static createServise(param) {
return new ExampleService(param)
}
}
To register the factories you have to specify the name of the function to be invoked, you can also assign parameters to the factory function
container
.register('factories.ServiceFactory', ServiceFactory, 'createServise')
.addArgument('param')
For this package I was inspired by Node Dependency Injection