1.2.0 • Published 3 years ago

sdijs v1.2.0

Weekly downloads
12
License
MIT
Repository
github
Last release
3 years ago

sdijs

A Simple Dependency Injection (DI) library for NodeJs. It’s lightweight, zero dependency, written in vanilla JavaScript, designed to inyect. No less, No more.

Why Dependency Injection ?

The Dependency Injection pattern is about separating the instantiation of objects from the actual logic and behavior that they encapsulate. This pattern has many benefits such as:

  • Explicit dependencies - all dependencies are passed in as constructor arguments, which makes it easy to understand how particular object depends on the rest of the environment,
  • Code reuse - such an object is much easier to reuse in other environments, because it is not coupled to a specific implementation of its dependencies,
  • and much easier to test, because testing is essentially about instantiating a single object without the rest of the environment.

Install

npm install sdijs

Example

const sdijs = require('sdijs');

// Initialize a new dijs instance.
const $Inject = new sdijs({
  verbose: true
});

// Function
const useCase = () => true;

// Class
class Entity {
  constructor({id, name, email}) {
    this.id = id;
    this.name = name;
    this.email = email;
  }
}

const CONFIG = {
  int: 10,
  string: 'foo',
  array: [1 ,2 ,3],
  db: {
    name: 'dev',
    url: 'http://127.0.0.1:1234'
  }
}

class ServiceA {
  constructor({config, entity}) {
    this.config = config;
    this.entity = entity;
  }
  index() {
    return 'index action from ServiceA ' + this.config.int;
  }
}

class ServiceB {
   constructor({config, useCase}) {
    this.config = config;
    this.useCase = useCase;
  }
  index() {
    return 'index action from ServiceB ' + this.config.string;
  }
}

//App.js Class
class App {
  constructor({serviceA, serviceB}) {
    this.serviceA = serviceA;
    this.serviceB = serviceB;
  }
  foo() {
    return this.serviceA.index();
  }
  bar() {
    return this.serviceB.index();
  }
}

$Inject.addSingleton(CONFIG, 'config');
$Inject.addValue(Entity,  'entity');
$Inject.addValue(useCase, 'useCase');
$Inject.addSingleton(ServiceA);
$Inject.addTransient(ServiceB);
$Inject.addSingleton(App);

// Resolves the dependency graph.
const app = $Inject.resolve('app');

console.log(app.foo());
console.log(app.bar());

Terminal output

 [S]  (class) serviceA ----------->  [S]  App
 [S]  (object) config ------------>  [S]  ServiceA
 [T]  (class) serviceB ----------->  [S]  App
 [S]  (object) config ------------>  [T]  ServiceB
index action from ServiceA 10
index action from ServiceB foo

Modes Types

There are 3 types of modes available.

TRANSIENT: The registration is resolved every time it is needed. This means if you resolve a class more than once, you will get back a new instance every time.

$Inject.addTransient(Service);

SINGLETON: The registration is always reused no matter what - that means that the resolved value is cached in the container.

$Inject.addSingleton(Service);

VALUE: Provide the given value as-is.

$Inject.addValue(Entity, 'entity');

Usage

new sdijs(options)

Returns a new dijs instance with the given methods.

const sdijs = require('sdijs');

// Initialize a new dijs instance.
const $Inject = new sdijs({
  verbose: true
});

Instance methods

$addSingleton(value, alias)

Sets a value in the namespace.

$addTransient(value, alias)

Sets a value in the namespace.

$addValue(value, alias)

Sets a value in the namespace.

$resolve(name)

Resolves the dependency graph.

Run tests

npm tun test

License

See the LICENSE file for license rights and limitations (MIT).

1.2.0

3 years ago

1.1.0

3 years ago

1.0.1

4 years ago

1.0.0

4 years ago