Я новичок в разработке NodeJs из мира .NET Я ищу в Интернете лучшие практики, регулирующие DI/DIP в Javascript
В .NET я объявлял бы свои зависимости в конструкторе, тогда как в javascript я вижу, что общий шаблон заключается в объявлении зависимостей на уровне модуля с помощью инструкции require.
для меня это выглядит так, когда я использую require, я привязан к определенному файлу, а использование конструктора для получения моей зависимости более гибкое.
Что бы вы рекомендовали сделать в качестве лучшей практики в javascript? (я ищу архитектурный образец, а не техническое решение IOC)
поиск в Интернете я пришел в этом сообщении в блоге (у которого есть очень интересная дискуссия в комментариях): https://blog.risingstack.com/dependency-injection-in-node-js/
он довольно хорошо переносит мой конфликт. здесь некоторый код из сообщения в блоге, чтобы вы поняли, о чем я говорю:
// team.js
var User = require('./user');
function getTeam(teamId) {  
  return User.find({teamId: teamId});
}
module.exports.getTeam = getTeam; 
Простой тест будет выглядеть примерно так:
 // team.spec.js
    var Team = require('./team');  
    var User = require('./user');
    describe('Team', function() {  
      it('#getTeam', function* () {
        var users = [{id: 1, id: 2}];
        this.sandbox.stub(User, 'find', function() {
          return Promise.resolve(users);
        });
        var team = yield team.getTeam();
        expect(team).to.eql(users);
      });
    });
VS DI:
// team.js
function Team(options) {  
  this.options = options;
}
Team.prototype.getTeam = function(teamId) {  
  return this.options.User.find({teamId: teamId})
}
function create(options) {  
  return new Team(options);
}
Тест:
// team.spec.js
var Team = require('./team');
describe('Team', function() {  
  it('#getTeam', function* () {
    var users = [{id: 1, id: 2}];
    var fakeUser = {
      find: function() {
        return Promise.resolve(users);
      }
    };
    var team = Team.create({
      User: fakeUser
    });
    var team = yield team.getTeam();
    expect(team).to.eql(users);
  });
});
