https://github.com/ap-dev-at-home/node-di-ioc
Evaluating an idea on how to do dependency injection and inversion of control in node.js/expressjs
https://github.com/ap-dev-at-home/node-di-ioc
dependency-container dependency-injection expressjs inversion-of-control ioc javascript nodejs
Last synced: 24 days ago
JSON representation
Evaluating an idea on how to do dependency injection and inversion of control in node.js/expressjs
- Host: GitHub
- URL: https://github.com/ap-dev-at-home/node-di-ioc
- Owner: ap-dev-at-home
- License: mit
- Created: 2024-12-07T18:06:57.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-02-13T20:32:45.000Z (over 1 year ago)
- Last Synced: 2025-06-02T17:53:27.282Z (12 months ago)
- Topics: dependency-container, dependency-injection, expressjs, inversion-of-control, ioc, javascript, nodejs
- Language: JavaScript
- Homepage:
- Size: 7.81 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# node-di-ioc
A draft on how to implement asp.net core like dependency injection and inversion of control in node.js
```javascript
// setup.js
const { di } = require('./lib/di-ioc/di-ioc');
const IOC_NAMESPACE_PROD = 'PROD';
const IOC_NAMESPACE_TEST = 'TEST';
module.exports.IOC_NAMESPACE_PROD = IOC_NAMESPACE_PROD;
module.exports.IOC_NAMESPACE_TEST = IOC_NAMESPACE_TEST;
// Register dependencies
// every call to di with different namespaces can setup dependencies for different environments/modules
di(IOC_NAMESPACE_PROD,
{
name: '_configService',
func: () => {
return {
user: 'User',
pw: 'secretpassword'
}
},
singleton: true // instance will be created once
},
{
name: '_dateTimeService',
func: () => {
return {
now: () => new Date()
}
}
},
{
name: '_dbService',
func: (_configService) => {
return {
user: _configService.user,
pw: _configService.pw,
connect: () => true
}
}
}
);
```
```javascript
// app.js
const express = require('express');
const console = require('console');
const { ioc } = require('./lib/di-ioc/di-ioc');
const { IOC_NAMESPACE_PROD, IOC_NAMESPACE_TEST } = require('./setup')
// node.js/expressjs test application
const app = express();
const port = 3000;
// Inversion of Control
// handover control to the node-di-ioc library
// by intercepting get calls to express.js
ioc(IOC_NAMESPACE_PROD, app, 'get'); // alter namespace to provide different dependencies
// request handlers will receive the dependencies as parameters
app.get('/time', (req, res, _dateTimeService) => {
res.send(`Hello World! It is ${_dateTimeService.now()}`);
});
app.get('/weather', (req, res, _dbService) => {
if (_dbService.connect() == true) {
// do something, get weather...
res.send('Weather is sunny');
}
else {
res.send('Weather is unknown');
}
});
app.listen(port, () => {
console.log(`App listening at http://localhost:${port}`);
});
```
### API Calls (most relevant)
| Call | Description |
| ------- | -------- |
| di(namespace, ...dependencies) | `namespace` - the namespace to add dependencies into
`dependencies` - depedency descriptors
`{dependency}` - object
- name: 'identifier'
- func: (...) => ... ` return instance, func can pass already setup depedencies`
- singleton: true/false |
|ioc(namespace, obj, funcName)| `namespace` - the namespace to pull the dependencies from
`obj` - an object owning the function to take control over
`funcName` - the name of the function to take control over |