npm install --save magnum-di//Load it up./
var injector = require('magnum-di')()
//Register some dependencies.
injector.service('MyService', {name: 'Bob', sayName: function(){console.log(this.name)}})
//inject them into your function
injector.inject(function(MyService){
MyService.sayName() // -> Bob
})- Managing complex applications with many files. Maintaining module dependencies in one location reduces errors and makes an application easier to reason about.
- Procedurally loading files with dependencies becomes much easier.
- Ease of testing in isolation, mocking module dependencies becomes trivial. No need to use a module to fiddle with the internals of require to get a mocked object into your module. With DI just register a different module with the correct methods and you are done mocking.
Here we register a dependency in our main application file, and use the injector to call the function returned by the require('./UserModel) call.
Run this with npm run example-server
//userRoutes.js
module.exports = function(Router, User) {
//Here Router and User will be injected.
Router.get('/', function(req, res, next){
User.userDetails('Bob', function(err, data){
res.json({user: data})
})
});
return {path: '/user', router: Router}
};
//app.js
var injector = require('magnum-di')();
var express = require('express');
var Database = require('./Database');
var app = express()
var http = require('http');
//Register some dependencies.
injector.factory('Router', express.Router);
injector.service('Database', Database);
//Here we are letting the injector provide the database to our UserModel
//This will make it simple to mock in our unit tests.
var User = injector.inject(require('./UserModel'));
injector.service('User', User);
var userRoute = injector.inject(require('./UserRoutes'));
app.use(userRoute.path, userRoute.router);
http.createServer(app).listen(8080);Following our above example, we use magnum-di to mock out our Database object for testing.
Run this with npm run example-test
var injector = require('magnum-di');
var should = require('should');
//Our mock database object
injector.service('Database', {
User: {
users: {George: {name: 'George', age: 30}, Mike: {name: 'Mike', age: 20}},
find: function(username, cb) {
var user = (this.users[username]) ? this.users[username] : null
cb(null, user);
}
}
});
//We now have a user model that is using our mock database.
var User = injector.inject(require('./UserModel'));
describe('Model being tested with a mock Database object', function() {
it('should not have real data', function(done) {
User.userDetails('Bob', function(err, data){
should(data).be.null
done()
})
});
it('should have mock data', function(done) {
User.userDetails('George', function(err, data){
data.age.should.equal(30)
done()
})
});
});Kind: global class
- MagnumDI
- new MagnumDI()
- .createChild() ⇒
MagnumDI - .service(name, item) ⇒
* - .instance(name, fn) ⇒
function - .factory(name, fn) ⇒
function - .merge(name, merge) ⇒
* - .get(name) ⇒
*|null - .replace(name, replacement) ⇒
Object - .unregister(name) ⇒
boolean - .inject(fnOrstr, thisArg) ⇒
*
Provides an instance of the Magnum DI injector.
magnumDI.createChild() ⇒ MagnumDI
Creates a Child instance of the current injector. Calls to .get or .inject will first search this injector, if a parameter is found it will return it if not it will continue up the tree until a value is found or the topmost instance is reached.
Kind: instance method of MagnumDI
Registers an object, string, number or function.
Kind: instance method of MagnumDI
Returns: * - Returns provided dependency
| Param | Type | Description |
|---|---|---|
| name | string |
Name to be used in the injected function |
| item | object | array | number | string | function |
Item to be injected. |
When injected, calls as a constructor with new.
Kind: instance method of MagnumDI
Returns: function - Returns provided function
| Param | Type | Description |
|---|---|---|
| name | string |
Name to be used in the injected function. |
| fn | function |
Function to be called with new. |
When injected, calls the passed function. Returns the result of that call.
Kind: instance method of MagnumDI
Returns: function - Retuens provided function.
| Param | Type | Description |
|---|---|---|
| name | string |
Name to be used in the injected function |
| fn | function |
Function to be called by injector. |
Merges supplied object into the object registered for , if doesn't exist it will be created.
Kind: instance method of MagnumDI
Returns: * - Returns provided dependency
| Param | Type | Description |
|---|---|---|
| name | String |
Dependency object to modify |
| merge | Object |
Object to merge with existing dependency |
Returns the specified dependency.
Kind: instance method of MagnumDI
Returns: * | null - The named dependency item, or null.
| Param | Type | Description |
|---|---|---|
| name | string |
Dependency to retrieve. |
Modifies a registered service object.
Kind: instance method of MagnumDI
Returns: Object - Replaced dependency
| Param | Type | Description |
|---|---|---|
| name | String |
Dependency object to modify. |
| replacement | Object |
Object to replace current registered object. |
Removes the specified dependency.
Kind: instance method of MagnumDI
Returns: boolean - The result of the operation.
| Param | Type | Description |
|---|---|---|
| name | string |
Registered dependency to remove. |
Runs the given function with args injected and with an optional context object.
Kind: instance method of MagnumDI
Returns: * - Returns the result of the called function.
| Param | Type | Description |
|---|---|---|
| fnOrstr | function | string |
function - inject args and run, string - Return the named dependency. |
| thisArg | object |
Calling context. |
Run tests with npm test.
Regenerate this Readme with npm run readme