在我的应用程序中,我实例化一个名为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 :(得分: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
)。每当我访问pool
frontend
时,调用者将被重定向到指定的pool
参数。甚至在frontend
对象内部。
//...
var frontend = applicationPool.get("myController").create(requestPool);
frontend.greetAction( parameters ); // this.pool will be redirected to requestPool
//...
在我办理登机手续之前,我会等待其他建议。