使用其他特定于上下文的属性定义引用

时间:2016-04-02 21:09:20

标签: node.js

在我的应用程序中,我实例化一个名为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为目标,getgetObjectPool陷阱。

我知道直接修改res是不好的做法。我可能会返回string / buffer。但所描述的问题仍然存在。因为我打算嵌入其他控制器。

我来自PHP + Symfony,你有ControllergetContainer方法和核心对象的快捷方式,做同样的事情。

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

干杯!

1 个答案:

答案 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
//...

在我办理登机手续之前,我会等待其他建议。