Flexible Dependency Injection Container with support for asynchronous service creation, annotations and middlewares.
Features:
- Autowiring
- Supports middlewares
- Allows to define service as constructor, (async) factory or a value
- Detects cycle dependencies
- Prevents race condition for concurrent service requests
- Supports annotations (and ability to search services by annotations)
- Simple service definition via container methods or decorators
npm install alpha-dic
import {createStandard} from 'alpha-dic';
const container = createStandard();
// if you're defining services via decorators
// preloadServiceModules(container, './path/to/service/modules/*')
container.definitionWithFactory('my-service', async () => {
const connection = new DatabaseConnection();
await connection.connect();
return connection;
});
container.get('my-service').then((connection) => {
// connection has been established in factory
});
Example with dependencies and decorators
import {createStandard, reference, AutowiredService, Service, OnActivation} from 'alpha-dic';
import * as assert from 'assert';
const container = createStandard();
@AutowiredService('NotificationCenter')
class NotificationCenter {
constructor(renderer: EmailRenderer, sender: EmailSender) {
assert.ok(renderer instanceof EmailRenderer);
// connection to SMTP was established in factory
assert.ok(sender instanceof EmailSender);
}
async sendEmail(to, type, vars) {
// render email
// send it via sender
}
}
@Service()
class EmailRenderer {
}
@Service()
@OnActivation(async (mailer) => {
await mailer.connectToSMTP();
return mailer;
})
class EmailSender {
}
container.get('NotificationCenter')
.then((centre) => {
return centre.sendEmail('[email protected]', 'limits-exceeded', {})
})