ノードで「必要」がデフォルトでシングルトンを作成することに気づいた。多くの人が、状態を持っているがシングルトンとして作成されているモジュールを必要としていると想定することができるので、複数の同時ユーザーがいるとすぐにアプリケーションを中断します。node、require、singletonまたはnot singleton?
私たちには反対の問題があります。非シングルトンを作成する必要があり、これを修正する方法がわかりません。
私の脳は、Java開発者として配線されているので、私たちのすべてのノードのファイル/モジュールはthusly定義されています。
ファイルplayerService.js
const Player = require("./player")
class PlayerService {
constructor(timeout) {
// some stuff
}
updatePlayer(player) {
// logic to lookup player in local array and change it for dev version.
// test version would lookup player in DB and update it.
}
}
module.exports = PlayerService
我々はそれを使用したい場合は、我々は次の操作を行います。
someHandler.js
const PlayerService = require("./playerService")
const SomeService = require("./someService")
playerService = new PlayerService(3000)
// some code which gets a player
playerService.updatePlayer(somePlayer)
(必要とするが)Sを作成します上記の場合、各WebSocketメッセージ(このケースでは)がスタック内で呼び出されるすべてのモジュールで新しいオブジェクトをインスタンス化するので、シングルトンを作成していないと推測しています。つまり、1つのメッセージにサービスを提供するには、5つの異なるサブサービス/ヘルパークラスが存在するため、サービスを5回インスタンス化する必要があります。ヘルパークラスはそれぞれを呼び出し、すべてをrequire()してから、同時ユーザーであり、不要なオブジェクト作成が多く発生します。
1)サービスが状態を持たないため、上記のクラスをシングルトンとして動作させるにはどうすればよいですか?
2)グローバルインポートまたはグローバルオブジェクトの作成という概念はありますか?特定のWebソケット接続および/またはすべての接続に対して一度オブジェクトをインポート(別名要求)したりインスタンス化したりできますか? index.jsなどはありません。スタック内のすべてのjsファイルに対して依存モジュール/ファイルを再要求する必要があるのは夢中に思えます。 DIオプションを見ても、何年もの試行錯誤にもかかわらず、js gurusではないので、それらを使用する方法を理解するにはあまりにも難解だと感じました。
あなたが何をしたいのかよく分かっていれば、playerService.jsに 'new PlayerService()'を書き出すことができ、すべてのケースに対して1つのオブジェクトを持つことになります。 – Edgar
エドガーに感謝します。サービスを必要とするファイルごとに新しいオブジェクトを作成することはありませんか?私。それは今のものと同じですか?例えば。 controller1.jsはvar playerService = require( "./ playerService")を実行し、新しいオブジェクトを取得し、controller2は同じことを行います。新しいオブジェクトも取得しますか?私はrequire()への呼び出しのたびにコード全体を評価すると仮定しています。 –
いいえ、それはそのようにしていません、それは内部キャッシュを持っている必要があり、2番目の要求ではキャッシュからオブジェクトを返します。 – Edgar