2017-06-27 11 views
1

ノードで「必要」がデフォルトでシングルトンを作成することに気づいた。多くの人が、状態を持っているがシングルトンとして作成されているモジュールを必要としていると想定することができるので、複数の同時ユーザーがいるとすぐにアプリケーションを中断します。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ではないので、それらを使用する方法を理解するにはあまりにも難解だと感じました。

+0

あなたが何をしたいのかよく分かっていれば、playerService.jsに 'new PlayerService()'を書き出すことができ、すべてのケースに対して1つのオブジェクトを持つことになります。 – Edgar

+0

エドガーに感謝します。サービスを必要とするファイルごとに新しいオブジェクトを作成することはありませんか?私。それは今のものと同じですか?例えば。 controller1.jsはvar playerService = require( "./ playerService")を実行し、新しいオブジェクトを取得し、controller2は同じことを行います。新しいオブジェクトも取得しますか?私はrequire()への呼び出しのたびにコード全体を評価すると仮定しています。 –

+0

いいえ、それはそのようにしていません、それは内部キャッシュを持っている必要があり、2番目の要求ではキャッシュからオブジェクトを返します。 – Edgar

答えて

1

ファイル内にインスタンスを作成してエクスポートすることができます。

let playerService = new PlayerService(); 
module.exports = playerService; 

この場合、カプセル化を保証するためにコンストラクタパラメータとして使用するメンバ変数にセッタを追加することができます。

newでオブジェクトインスタンスを作成することは、プロトタイプモデル(more)のため、従来のOOP言語よりも安価です。

JavaScriptのオブジェクトはプロトタイプのメソッドではかなりメモリ効率が良く、最新のエンジンは優れているので(コードに見られるように、実際にはタイムアウトコンストラクタパラメータを共有したいのですか?)、新しいインスタンスが本当に必要なときは躊躇しないでください。メモリリークを防ぐためのガベージコレクタ。

関連する問題