2017-08-30 18 views
0

私はいくつかのモジュールを持つNodeJSのホームオートメーションプロジェクトに取り組んでいます。これらのモジュールは、中央のDeviceManager内のデータデバイスにアクセスする必要があります。通常、私はすべてのモジュールがDeviceManagerの同じ状態にアクセスするように、この目的のためにシングルトンを作成します。私が使用してシングルトンを作成するにはNodeJSのモジュール間でデータを共有する

class DevicesManagerInstance { 

    constructor() { 

     this.devices = {}; 

    } 

    addDevice(id, device) { 
     this.devices.id = device; 
    } 

} 

let DevicesManagerInstance = new DevicesManager(); 

module.exports = DevicesManagerInstance; 

を、それがデータを共有するためのデNodeJSの方法であれば、私は質問への答えに満足シングルトンと共有データに関するいくつかの古い質問を見つけましたが、まだいませんでした。

また、読み込みシングルトンはアンチパターンです。誰かがモジュール間でデータを共有する "NodeJS"の仕組み(私の場合はデバイス)を明確にすることができます。 Angularでは、この目的のためにサービスを作成します。

+0

DevicesManagerは他のすべてと同じプロセスに入りますか? – sparrow

+0

はい、それは、同じデバイスデータにアクセスするために必要なモジュールがたくさんあることです。 –

+1

あなたが持っているものは完全に素晴らしいです!幸運:) – sparrow

答えて

1

なぜ壊れていないものを修正するのですか?あなたのアプローチがうまくいけば、それは動作します。

これは、インスタンスを1つだけ作成する場合は、クラスを作成する理由はありません。あなたはデバイスがモジュールの利用可能外にしたくない場合は、

var DeviceManager = { 
    devices: {}, 
    addDevice(id, device) { // this is valid syntax 
     DeviceManager.devices[id] = device; 
    } 
}; 
module.exports = DeviceManager; 

のか:私は別のアプローチを選ぶでしょう

var devices = {}; 
var DeviceManager = { 
    addDevice(id, device) { // this is valid syntax 
     devices[id] = device; 
    } 
}; 
module.exports = DeviceManager; 
+0

コンストラクタの部分についてはどうですか?私の例は実際のクラスでは単純化され、多くの操作と初期化が行われています。たとえば、init関数を作成するだけですか? –

+1

何かを初期化するときだけ定義関数を作成するのはなぜですか?個人的には、DeviceManagerを定義したらすべてを初期化します。 – EKW

1

これは、単一のインスタンスであるが、あなたは、クラス、あなたが必要な場合また、簡単にクラス構造を以下のように変換することができ、

var DeviceManager = function() { 
     this.devices: []; // constructor 
}; 

DeviceManager.prototype.addDevice = function(id, device) { 
      DeviceManager.devices[id] = device;   
}; 
var deviceManager = new DeviceManager(); 
module.exports = deviceManager; 

あなたは

として他のモジュールで デバイスにアクセスすることができます
var DeviceManager = require('./devicemanager'); 
DeviceManager.devices; // accessing devices 
+0

コンストラクタ部分はどうですか?私の例は実際のクラスでは単純化され、多くの操作と初期化が行われています。たとえば、init関数を作成するだけですか? –

+1

スクリプト@BasvanDijkを更新しました。そのインスタンスにアクセスでき、** DeviceManager **インスタンスが1つしかありません。 –

関連する問題