2016-04-02 28 views
0

ile başvuru tanımla controller adında bir uygulama geniş nesnesini başlatıyorum. Ayrıca bir sunucu başlatıyorum. Yedeklemeyi düşük tutmak istediğimden beri, her istekte controller için bir ön uç oluşturmak istiyorum, controller için bir kopya/başvuru, ancak istek geniş nesneler/yapılandırmaları içeren ve controller içinden erişilebilen ek bir pool özelliği ile .Uygulamamda ek içeriğe özgü özellikler

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); 

Ve Controller sınıfı: Bir BaseController sınıfı hakkında

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; 

Ek düşüncelerim: şuydun Takıldığım edilir

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; 

. Test ettiğim şey için. pool'u frontend'a eklerseniz, controller nesnesine de uygulanır. Yeni bir nesne oluşturmayı ve controller'un tüm özelliklerini eklemeyi düşünüyorum. Ayrıca, controller hedef ve getObjectPool için get trap'a sahip olmakla birlikte proxy'lere bir göz atıyorum.

Doğrudan res'u değiştirmenin hatalı olduğunu biliyorum. Muhtemelen bunun yerine string/buffer dönecektir. Ama anlatılan problem devam ediyor. Diğer kontrolörleri yerleştirmeyi planlarken.

PHP + Symfony'den geliyorum, yöntemiyle ve getContainer yöntemine sahip bir sınıf ve temel nesneler için kısayollar, aynı şeyi yapıyor.

Herhangi bir düşünce takdir edilmektedir. Bir süre bunu çözmeye çalışıyorum.

Şerefe!

cevap

0

Tamam Bir çözüm buldum. Aslında tüm "korunan" verileri "__" özelliğinde (this.__.pool) kaydeddiğimden bu biraz zor.

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

Bu controller için Proxy (frontend) döndürür: İşte bu örnekte çalışan create fonksiyonu için kodudur. 'un frontend numarasına her eriştiğimde, arayan kişi atanan pool argümanına yönlendirilir. frontend nesnesinin içinde bile.

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

çözüldü gibi check önce, diğer öneriler için bekleyecektir.