メインアプリと認証アプリのモジュールとして、個別のルーターファイルを使用します。変数(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
paramsを挿入し、Routes
コードのみをテストできます。server.js
_)にまとめます。これにより、システム内ですべてがどのように組み合わされるかを確認するための単一の場所が提供されます。私が見たこのことについてのより良い説明の1つは、 Mark Seemanとのインタビュー 、素晴らしい本の著者です .NETでの依存性注入。 JavaScript、特にNode.jsにも同様に適用されます。require
は、単なるモジュールシステムではなく、古典的なサービスロケーターとしてよく使用されます。
Dbインスタンスと、「シングルトン」のようにグローバルに使用する必要がある他のもので設定ファイルを作成することをお勧めします。
たとえば、redis dbクライアントにsettings.jsがあります:
var redis = require('redis');
exports.redis = redis.createClient(6379, '127.0.0.1');
そして、他の複数のモジュールにそれを含めます:
var settings = require('./settings');
setting.redis.<...>
それを含む多くの場合、私は常にdb接続の1つのインスタンスを持っています。
依存性注入フレームワークを使用する場合、モジュールを接続するためのすべての定型コードを保存できます
この回答 そのうちのいくつかをリストします。 ここではより単純なDIフレームワーク も作成しました。
EDIT:以下は、ページが変更された場合の回答のコピーです
require
は、Node.jsで依存関係を管理する方法であり、確かに直感的で効果的ですが、制限もあります。
私のアドバイスは、Node.jsで現在利用できるDependency Injectionコンテナのいくつかを見て、その長所/短所を把握することです。それらのいくつかは次のとおりです。
ほんの数例を挙げます。
本当の問題は、単純なrequire
と比較して、Node.js DIコンテナーで何を達成できるかということです。
長所:
短所:
require
を使用しないことは、Node考え方から逸脱しているように感じられます。それは完全に時代遅れですが、スクリプトでglobal
を使用できます:
global.foo = new Foo();
別のスクリプトで:
foo.bar();
既存の定数を使用することもできます:
Object.foo = new Foo();
そしてここ :
Object.foo.bar();