2016-04-02 4 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 и ярлыки для основных объектов, что делает то же самое.

Любые мысли приветствуются. Тем временем я пытаюсь решить это.

Cheers!

ответ

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

Я буду ждать других предложений, прежде чем я зарегистрируюсь, как разрешено.

Смежные вопросы