2016-04-02 109 views
0

在我的应用程序中,我实例化了一个名为controller的应用程序范围对象。另外,我正在启动一台服务器。由于我想保持冗余低,每个请求我想实例化一个前端controller,这是一个复制/参考controller,但与另一个pool财产,其中包含请求宽对象/配置,可以从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类:

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; 

附加我约BaseController类的想法:

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; 

这是我被困。对于我测试的。如果我将pool添加到frontend它也适用于controller对象。我正在考虑创建一个新对象并追加controller的所有属性。我还看了一下代理,controller作为目标,get陷阱为getObjectPool

我知道直接修改res是不好的做法。相反,我可能会返回string/buffer。但所描述的问题仍然存在。正如我计划嵌入其他控制器。

我来自PHP + Symfony,你有一个Controller类与getContainer方法和核心对象的快捷方式,做同样的事情。

任何想法表示赞赏。有一段时间我正试图解决这个问题。

干杯!

回答

0

好吧我想我有一个解决方案。这有点棘手,因为我实际上将所有“受保护”数据保存在"__"属性(this.__.pool)中。下面是在该示例中,工作create功能的代码:

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

这将返回一个代理(frontend)为controller。每当我访问frontendpool,调用者将被重定向到分配的pool参数。即使在frontend对象内。

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

我会等待其他建议,我检查之前解决。

相关问题