How to make an effective dependency injection in Nodejs?

Let's start with some reference code.

var express = require('express');  
var app = express();  
var session = require('express-session');

app.use(session({  
  store: require('connect-session-knex')()
}));

I have a couple of questions that I would like to answer if you know the answer:

Every time requireis a call in Nodejs, is it a named dependency injection? Or what is the real meaning of dependency injection?

The reason I ask about this is because I read about Node and I see people talking about the template moduleor module.export, and I am embarrassed, modulejust like dependency?

So, all I need is a clear explanation about dependency injection and when / where you need to inject the dependency.,.

+4
source share
3

. require() , , . require() , , .

, , , ( ), . , .

, Nodejs, ? ?

. require() , .

, , , Node, , module.export, , , ?

. require() . ( require() ).

, . , , (, ).


- . , . , , .

, , , , , , API , , , , API. , . , , , , , .

+7

.

var someModule = require('pathToSomeModule');

someModule();

DEPEND , . SAME .

angular ( , , )

app.controller('someCtrl', function($scope) {
  $scope.foo = 'bar';
});

, js / , , . WHAT $scope ACTUALLY, , angular - CALLED $scope.

: " , ".

- ( , - )

// The only require statement
var container = require('pathToContainer')

var someModule = container.resolve('someModule');

someModule();

? , ( , ). , someModule, , , . , , someModule, API, orignal, ENTIRE . . , someModule, . , , api, . ( , ), , , .

, .

, ( api ), .

node.js

// In a file, far, far, away
module.exports = function(dependencyA, dependencyB) {
  dependencyA();
  dependencyB();
}

// In another file, the `caller`
// This is where the actual, concrete implementation is stored
var depA = someConcreteImplementation;
var depB = someOtherConcreteImplementation;

var someModule = require('pathToSomeModule');

someModule(depA, depB);

, , . , , .

.

babel -, , angular -style-parsing

http://krasimirtsonev.com/blog/article/Dependency-injection-in-JavaScript

, require, .

+2

I use injection-jswith ts-node:

npm i -P injection-js

It is based on an angular2 injector , so Injection is just super.

Here is the typescript version from README.

import 'reflect-metadata';
import { ReflectiveInjector, Injectable, Injector } from 'injection-js';

class Http {}

@Injectable()
class Service {
  constructor(private http: Http) {}
}

@Injectable()
class Service2 {
  constructor(private injector: Injector) {}

  getService(): void {
    console.log(this.injector.get(Service) instanceof Service);
  }

  createChildInjector(): void {
    const childInjector = ReflectiveInjector.resolveAndCreate([
      Service
    ], this.injector);
  }
}

const injector = ReflectiveInjector.resolveAndCreate([
  Service,
  Http
]);

console.log(injector.get(Service) instanceof Service);
0
source

Source: https://habr.com/ru/post/1629063/


All Articles