私は .NET の世界から来た NodeJs 開発に不慣れです。Javascript で DI / DIP を再構築するベスト プラクティスを Web で検索しています。
.NET では、コンストラクターで依存関係を宣言しますが、javascript では、require ステートメントを介してモジュール レベルで依存関係を宣言するという一般的なパターンが見られます。
私にとっては、 require を使用すると、特定のファイルに結合されているように見えますが、コンストラクターを使用して依存関係を受け取る方がより柔軟です。
JavaScript のベスト プラクティスとして何をすることをお勧めしますか? (IOC 技術ソリューションではなく、アーキテクチャ パターンを探しています)
Web を検索すると、このブログ投稿にたどり着きました (コメントで非常に興味深い議論が行われています): 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);
});
});