メインアプリと認証アプリのモジュールとして別々のルーターファイルを使用しています。変数(dbクライアント)をルーターに渡すための最良の方法を取得できません。私はそれをハードコーディングしたり、次のものと一緒に渡したりしたくありません:
module.exports = function(app, db) {
たぶん、シングルトンレジスタを使用するか、グローバルdb変数を使用するのが最善の方法ですか?
デザインパターンの経験は何ですか?どちらの方法が最適で、その理由は何ですか?
メインアプリと認証アプリのモジュールとして別々のルーターファイルを使用しています。変数(dbクライアント)をルーターに渡すための最良の方法を取得できません。私はそれをハードコーディングしたり、次のものと一緒に渡したりしたくありません:
module.exports = function(app, db) {
たぶん、シングルトンレジスタを使用するか、グローバルdb変数を使用するのが最善の方法ですか?
デザインパターンの経験は何ですか?どちらの方法が最適で、その理由は何ですか?
私は、依存性注入を使用して、物事を渡すのが最良のスタイルであることに気づきました。それは確かにあなたが持っているようなものに見えるでしょう:
// App.js
module.exports = function App() {
};
// Database.js
module.exports = function Database(configuration) {
};
// Routes.js
module.exports = function Routes(app, database) {
};
// server.js: composition root
var App = require("./App");
var Database = require("./Database");
var Routes = require("./Routes");
var dbConfig = require("./dbconfig.json");
var app = new App();
var database = new Database(dbConfig);
var routes = new Routes(app, database);
// Use routes.
これには多くの利点があります。
require("databaseSingleton")
ますglobal.database
。Routes
。単独でテストしたい場合は、偽app
のパラメーターとパラメーターを挿入して、コード自体database
のみをテストできます。Routes
server.js
これにより、すべてのオブジェクトグラフの配線が1つの場所、つまりコンポジションルート(この場合はアプリのエントリポイント)にまとめられます。これにより、システム内ですべてがどのように組み合わされているかを確認するための単一の場所が提供されます。私が見たこれについてのより良い説明の1つは、.NETの優れた本DependencyInjectionの著者であるMarkSeemanへのインタビューです。これはJavaScript、特にNode.jsにも同様に適用されます。モジュールシステムだけでなく、従来のサービスロケーターとしてよく使用されます。require
dbインスタンスや、「singleton」などのグローバルに使用する必要のあるその他のものを使用して設定ファイルを作成することをお勧めします。
たとえば、redisdbクライアントでsettings.jsがあります。
var redis = require('redis');
exports.redis = redis.createClient(6379, '127.0.0.1');
そして、他の複数のモジュールに私はそれを含めます:
var settings = require('./settings');
setting.redis.<...>
それを含めて多くの場合、私は常にdb接続のインスタンスを1つ持っています。
依存性注入フレームワークを使用すると、モジュールを配線するための定型コードをすべて節約できます。
この回答には、それらのいくつかがリストされています。また、ここでより単純なDIフレームワークを構築しました。
編集:以下は、ページが変更された場合の回答からのコピーです
require
はNode.jsの依存関係を管理する方法であり、確かに直感的で効果的ですが、制限もあります。
私のアドバイスは、Node.jsで現在利用可能な依存性注入コンテナーのいくつかを見て、それらの長所/短所が何であるかを理解することです。それらのいくつかは次のとおりです。
ほんの数例を挙げると。
さて、本当の問題は、単純なものと比較して、Node.jsDIコンテナーで何を達成できるかということですrequire
。
長所:
短所:
require
ないと、Nodeの考え方から逸脱しているように感じます。それは完全に時代遅れですがglobal
、スクリプトで使用できます:
global.foo = new Foo();
別のスクリプトで:
foo.bar();
既存の定数を使用することもできます:
Object.foo = new Foo();
そしてここ :
Object.foo.bar();