2009-12-28 4 views
1

У меня есть виртуальная функция, которая называется handlePathChange() в моем классе Controller.
Он проверяет текущий URL-адрес и отправляет ему правильный вид.
Вот код, который я до сих пор:Как сообщить контроллеру, что посмотреть?

void Controller::handlePathChange() 
{ 
    if (app->internalPathMatches(basePath)) 
    { 
     string path = app->internalPathNextPart(basePath); 

     if (path.empty()) // If it's empty it is known that the index of the controller should show up 
      index(); 
     // else if (path == ??) each controller has it's own routes 
     // call_some_unknown_function(); 
    } 
} 

Как я могу обобщить это?
Я думал о два варианта:

  1. Вызов чисто виртуальная функция называется отправка(), которая будет соответствовать правильный путь к правой функции в производном классе. Это решение нарушает DRY, поскольку в основном вы будете писать один и тот же код снова и снова.
  2. Создайте хэш-карты std :: function, но если часть URL-адреса является параметром, то представление не будет найдено. Так что этот вариант недостаточно хорош.

Любые идеи?

ответ

1

Я понимаю, что ваш пост использует C++ пример, но если вы не возражаете, чтение некоторых C#, эта статья Скотта Гатри является большой обзор того, как рамки ASP.NET MVC реализует маршрутизацию:

http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

Я думаю, вы найдете эту статью очень полезной. В чрезмерно упрощенной сортировке он похож на ваш вариант №2, но он всегда проверяет параметр. Если параметр не указан, он использует одно и то же правило маршрутизации, но предоставляет значение по умолчанию и отправляет запрос в правильное представление. Эта стратегия позволяет избежать проблемы, о которой вы говорите, где не удается найти соответствующее представление, если указан параметр.

Надеюсь, это поможет.

+1

Здесь проблема, потому что C++ не хватает отражения. Я не могу вызвать index() из строки «index». Более того, я не могу иметь гетерогенный контейнер, который содержит объекты функций, которые не имеют одинаковой длины параметров? –

+0

А, я вижу. Не знаете, как обращаться с динамическим вызовом, отличным от того, что вы предлагаете в # 1 и # 2. Однако с параметрами вы не могли бы принять одинаковое количество параметров, а затем просто предоставлять значения по умолчанию? Например, - разобрать URL-адрес - определить предполагаемое действие как первую/среднюю часть URL-адреса - назначить дополнительные параметры, если они указаны, в противном случае отправить значения по умолчанию для значений параметров? Похоже, что с помощью этого подхода может работать ваш вариант №2? –

+0

Я начал писать. На данный момент я использую хэш-карту параметров (key: string, value: string), что я имею в виду, если они не соответствуют контроллеру или действию, а затем добавляются к параметрам. Теперь я выполняю настройки по умолчанию. Как бы вы реализовали setView, как в ASP.Net MVC? –

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