npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

plus.container

v1.1.16

Published

Dependency Injection Container - plus.container

Downloads

1,628

Readme

Dependency Injection Container / plus.container

https://en.wikipedia.org/wiki/Dependency_injection

That is simple dependency injection container, it allows to keep your application simple and DRY. Allows to manage services and inject dependencies. Article about this

Simple usage

var Container = require('plus.container');
var container = new Container();

ES6

        "use strict";

        class MyService {
            constructor(a, b) {
                this.a = a;
                this.b = b;
            }
        }

        container.register('A', 'AA');
        container.register('B', 'BB');
        container.register('myService', MyService, ['A', 'B']);

        var instance = container.get('myService');
        // instance.should.be.instanceof(MyService);
        // "AA".should.equal(instance.a);
        // "BB".should.equal(instance.b);

Behaviour with ES6 is same as ES5 "classes" you can mix ES5 and ES6 services too.

ES6 provide/injection and custom mapping

Examples with dependency injection for ES6/ES2015

Dependency injection ES6.

/// example 1 // 

container.add('a', 1);
container.add('b', 2);

container.provide('c', (({a, b}) => {
    return {
        result: a + b
    };
}));

console.log('c', container.get('c'));
console.log('c', container.c); // container.c it is alias for container.get('c')
// c { result: 3 }
// c { result: 3 }

When we ask c it means that container will inject service a and b to the c and we will see result. It means c service will get to arguments c(a, b) looks cool :)

Dependency injection ES6 with mapping.

// exmaple 2 with mapping
container.add('a', 1);
container.add('b', 2);
container.add('customA', 7);

let remap = {
    a: 'customA'
}

container.provide('c', (({a, b}) => {
    return {
        result: a + b
    };
}), remap);


console.log('c', container.get('c'));
console.log('c', container.c); // container.c it is alias for container.get('c')
// c { result: 9 }
// c { result: 9 }

It means c service will get to arguments c(customA, b) it means that we can provide custom implementation to c service.

Register service and use ES5 examples

// define your class
var MyClass = function () {}

// register in container
container.register('myService', MyClass);

var service = container.get('myService'); // get service
// service.should.be.instanceof(MyClass); 

// it equals: var service = new MyClass();
// AND: container.get('myService') === container.get('myService') // true

Inject dependencies

// define your classes
var MyClass1 = function () {}
var MyClass2 = function (myService1) {
    // myService1.should.be.instanceof(MyClass1);
}

// register in container
container.register('myService1', MyClass1);
container.register('myService2', MyClass2, ['myService1']);

var service2 = container.get('myService2');
// service2.should.be.instanceof(MyClass2);
// it equals: var service2 = new MyClass2(new MyClass1());

// AND: container.get('myService2') === container.get('myService2'); // true

Nested access

   var config = {
        host: 'yyy.com',
        db: {
            host: 'localhost'
        }
   } 
   
   container.register('config', config);
   container.get('config/host'); // yyy.com
   container.get('config/db/host'); // localhost

for example this way:

 var config = {
        db: {
            host: 'localhost'
            port: 27017
            database: 'test1'
        }
   } 
   
   container.register('config', config);
   container.register('database', require('../services/database', ['config/db']);
   
   var database = container.get('database');
   // it equals: var database = new Database(config.db);
   // it will provide to service just part of configurataion related to DB.

Tags, you can find/filter services by tags

Mark your services with tags and find them. It allows to build plugins.

    var Class1 = function(){ return {CLASS: 1} }
    Class1.$tags = ['tag1'];

    var Class2 = function(){ return {CLASS: 2} }
    Class2.$tags = ['tag1', 'tag2'];

    container.register('class1', Class1);
    container.register('class2', Class2);

    var tag1services = container.find(['tag1']);
    // returns array of services
    // tag1services.length == 2, we will see both of them.

    var tag2services = container.find(['tag2']);
    // tag2services.length == 1, we will see Class2 instance

    var tag1_minus_tag2_services = container.find(['tag1'], ['tag2']);
    // tag1_minus_tag2_services.length == 1, we will see Class1 instance

Loading services with environment

Dir

.
|-- container.js
|-- container_dev.js
|-- container_prod.js
`-- container_test.js
// container.js example

module.exports = function (container) {

    var Class1 = function(){  }
    var Class2 = function(){  }

    container.register('service1', Class1);
    container.register('service2', Class2);

    container.register('service3', require('../services/Service3'), ['service1']);
    container.register('service4', require('../services/Service4'), ['service1', 'service2']);

}
Usage

Your application's code.

// app.js

// loading container from the folder, it allows to manage environments
var container = Container.load(
{
    dir: __dirname,
    env: process.env.NODE_ENV || 'dev'
});

container.get('service1') // it equals new Class1()
container.get('service2') // it equals new Class2()
container.get('service3') // it equals new Service3(new Class1())
container.get('service4') // it equals new Service4(new Class1(), new Class2())

// BUT: container.get('service4') === container.get('service4') // true // :)
Run this!

node app.js

This code load container.js code in this order:

  • container.js // register common services
  • container_dev.js // register environment depended services and you can override common services

If we use environment it looks like: NODE_ENV=test node app.js

in this case it loads container in this order:

  • container.js // register common services
  • container_test.js // register environment (test) dependent services and you can override common services

Have a fun and manage your services! +1G Team

Misc

How to use in the browser?

var container =  require('plus.container/lite').create()

Aliases

Services registration
container.register(name, definition, deps) 
container.add(name, definition, deps) /// same
Container creating
var container = new Container();
var container = require('plus.container').create() //same