it('should let me register a single object and get the same instance on each request', function() { var instanceCount = 0; function MyService() { ++instanceCount; }; var container = intravenous.create(); var theOnlyInstance = new MyService() container.register('myService', theOnlyInstance); var instance2 = container.get('myService'); expect(instance2).to.equal(theOnlyInstance); expect(instanceCount).to.equal(1); });
it('should let me register a ctor function and get a new instance on each request', function() { var instanceCount = 0; function MyService() { ++instanceCount; }; var container = intravenous.create(); container.register('myService', MyService, 'unique'); var instance1 = container.get('myService'); expect(instance1).to.be.instanceof(MyService); expect(instanceCount).to.equal(1); var instance2 = container.get('myService'); expect(instance2).to.be.instanceof(MyService); expect(instanceCount).to.equal(2); });
it('should let me register a ctor function as a singleton', function() { var instanceCount = 0; function MyService() { ++instanceCount; }; var container = intravenous.create(); container.register('myService', MyService, 'singleton'); var instance1 = container.get('myService'); expect(instance1).to.be.instanceof(MyService); expect(instanceCount).to.equal(1); var instance2 = container.get('myService'); expect(instance2).to.be.instanceof(MyService); expect(instanceCount).to.equal(1); });
module.exports = function(service, deps, dispose) { if(dispose !== undefined) { // Attach a disposal process service.prototype.dispose = dispose; } // Attach constructor arguments to the injector service.$inject = annotate(service); service.$inject.push('container'); // Create the DIC var container = intravenous.create({ onDispose: function(instance, key) { if (instance.dispose) instance.dispose(); } }); if(deps !== undefined) { // Define dependencies for(var i in deps) { container.register(i, deps[i]); } } // Register the root parent container.register('_bulkheadService', service); return function() { var args = Array.prototype.slice.call(arguments, 0); if(args.length == service.length + 1) { // Found a injection object, overwrite container registrations var injection = args.pop(); for(var i in injection) { container.register(i, injection[i]); } } for(var i = 0; i < args.length; i++) { // Overwrite container registration with constructor arguments container.register(service.$inject[i], args[i]); } return container.get('_bulkheadService'); }; };
it('should let me inject things', function() { function DAL(dbFilename) { this.dbFilename = dbFilename; }; DAL.$inject = ['dbFilename']; function SL(dal) { this.dal = dal; }; SL.$inject = ['dal']; var container = intravenous.create(); container.register('dbFilename', 'my.db', 'singleton'); container.register('dal', DAL, 'singleton'); container.register('sl', SL, 'singleton'); var sl = container.get('sl'); expect(sl.dal.dbFilename).to.equal('my.db'); });
//http://www.mariocasciaro.me/dependency-injection-in-node-js-and-other-architectural-patterns //http://www.royjacobs.org/intravenous/ var http = require('http'); var path = require('path'); var express = require('express'); var router = express(); var server = http.createServer(router); var intravenous = require('intravenous'); var civilized = require('./greeter/civilizedGreeter.js'); var pirate = require('./greeter/pirateGreeter.js'); var manager = require('./greeter/greetingManager.js'); var container = intravenous.create(); container.register("GreetingManager", manager); router.use(express.static(path.resolve(__dirname, 'client'))); router.get("/hello", function(req, res){ var name = req.query.name; container.register("name", name); container.register("greeter", civilized); var gm = container.get("GreetingManager"); res.send(gm.salute()); });
var intervenous = require('intravenous') , webshop = require('./classes') , common = require('../commons/classes'); // Create IOC container var container = intervenous.create(); // Register all classes common.concat(webshop).forEach(function (item) { var fullyQualifiedPath = item.path + '/' + item.name + '.js'; console.log("Registering " + fullyQualifiedPath); container.register(item.name, require(fullyQualifiedPath), "singleton"); }); // Get the application var app = container.get("App"); // Wire any non-wired classes common.concat(webshop) .filter(function (item) { return item.auto; }) .forEach(function (item) { container.get(item.name); }); // Start the main application