2016-04-02 8 views
0

私のアプリケーションcontrollerと呼ばれるアプリケーションワイドオブジェクトをインスタンス化します。また、私はサーバーを起動しています。冗長性を低く保つため、各リクエストでフロントエンドをcontrollerにインスタンス化したい場合は、controllerへのコピー/参照ですが、追加のpoolプロパティがあり、リクエストワイドオブジェクト/ configsを含み、controller追加のコンテキスト固有のプロパティを持つ参照を定義する

var applicationPool = new ObjectPool(); // container for objects 
var controller = new Controller(); // application wide instance 
var server = http.createServer(); 

applicationPool.set("myController", controller); 

server.on("request",function(req,res){ 
    var requestPool = new ObjectPool(); 

    requestPool.set("request",req); 
    requestPool.set("response",res); 

    /* 
    * pool population 
    * routing 
    * controller resolving 
    * parameter resolving 
    */ 

    // frontend specific to current request 
    var frontend = applicationPool.get("myController").create(requestPool); 

    // hopefully finishes res 
    frontend.greetAction(parameters); 

    /* 
    * post response actions 
    */ 
} 

server.listen(3000); 

そしてControllerクラス:BaseControllerクラスに関する

function Controller(){ 
    BaseController.call(this); 
    // ... 
} 

function greetAction(parameters){ 
    var res = this.getObjectPool().get("response"); // defined in BaseController 
    res.end(format("Greetings, %s!",parameters["name"])); 
} 

Controller.prototype = Object.create(BaseController.prototype); 
Controller.prototype.greetAction = greetAction; 

追加私の考え:

function BaseController(){ ... } 

function getObjectPool(){ 
    return this.pool; 
} 

function create(pool){ 
    var frontend = Object.create(this.__proto__, this); 
    frontend.pool = pool; 
    return frontend; 
} 

BaseController.prototype.getObjectPool = getObjectPool; 
BaseController.prototype.create = create; 

これは、私が行き詰まったです。私がテストしたもののために。 poolfrontendに追加すると、controllerオブジェクトにも適用されます。私は新しいオブジェクトを作成し、controllerのすべてのプロパティを追加することを考えています。私はプロキシを一目で見て、controllerをターゲットとし、getのトラップをgetObjectPoolとしています。

私は修正を知っていますresは直接悪い習慣です。おそらくstring/bufferが返されます。しかし、説明されている問題はそのままです。私は他のコントローラを組み込む予定です。

私は、ControllerクラスとgetContainerメソッドを持つPHP + Symfonyから来ています。同じことをするコアオブジェクトのショートカットです。

ご迷惑をおかけして申し訳ございません。私はこれを解決しようとしています。

乾杯!

答えて

0

私は解決策があると思います。私が実際に"__"プロパティ(this.__.pool)にすべての "保護された"データを保存しているので、ややこしいことです。ここで作業create関数のコードは、この例である:

function create(pool){ 
    return new Proxy(this,{ 
     get: function(target, property){ 
      if(property === 'pool') return pool; 
      return target[property]; 
     } 
    }); 
} 

これはcontrollerのプロキシ(frontend)を返します。 poolfrontendにアクセスするたびに、発信者は割り当てられたpool引数にリダイレクトされます。 frontendオブジェクト内であっても。

//... 
var frontend = applicationPool.get("myController").create(requestPool); 
frontend.greetAction(parameters); // this.pool will be redirected to requestPool 
//... 

解決済みのようにチェックインする前に、私は他の提案を待つことになります。