2016-11-02 6 views
0

У нас есть ситуация, когда наше приложение имеет несколько модулей, которые реализуют api. Каждый из этих модулей имеет зависимость, которая, в свою очередь, зависит от правильной настройки пути каталога данных. Эти модули не должны быть сконфигурированы до тех пор, пока этот путь не будет настроен.Динамически регистрирующиеся и незарегистрированные маршруты/модули Нэнси

У нас также есть модуль, который реализует настройку и проверку конфигурации, включая настройку вышеупомянутого пути.

Мы хотели бы как-то «отключить» модули данных до тех пор, пока конфиг не будет подтвержден. Конфигурация будет подтверждена, например, при запуске мы проверяем, что каталог данных существует и действителен. Кроме того, когда пользователь сохраняет изменения через конфигурационный модуль, мы снова сделаем это подтверждение. Чтобы повторить, пользователь устанавливает каталог данных, а затем все модули данных становятся доступными. Когда пользователь устанавливает недопустимый каталог данных (или мы запускаем, а существующий - недопустимым), все модули становятся недоступными.

Мы попытались зарегистрировать обработчик на pipelines.BeforeRequest, но это не помогло. Мы на самом деле терпим неудачу намного раньше, когда Нэнси создает экземпляры наших модулей как часть заполнения RouteCache. Нам нужно предотвратить это создание, пока мы не сможем подтвердить, что мы настроены.

Похоже, мы должны иметь возможность сказать «использовать этот набор модулей, когда какое-либо условие истинно, и использовать этот другой набор, когда условие ложно». Как это происходит в Нэнси?

ответ

0

Если все эти модули вы имеете в виду реализовать тот же интерфейс (т.е. определить тот же набор Method + Pattern + Action обработчиков), то, возможно, вы должны использовать только один модуль для обработки запросов для всех из них, и использовать (например, "/{path}/api/operation/") в шаблоне вашего модуля, чтобы определить, к какому пути (т.е. директорию данных) вы обращаетесь.

Затем, в теле действия, вы можете проверить, удовлетворяются ли условия, которые вам нужны. Что-то вроде этого:

Get["/app/{directory}/api/status"] = parameters => { 
    var dataDirectory = parameters.directory; 
    // Do whatever condition checks you need with the dataDirectory value 
    // and return the appropriate HTTP status code if they are not met, 
    // otherwise continue handling the request 
    return HttpStatus.OK; 
} 

Другой подход (опять же при использовании одного модуля для обработки всех этих запросов), чтобы использовать параметр ограничения пользовательских маршрутов (см https://github.com/NancyFx/Nancy/wiki/Defining-routes#custom-constraints). В этом случае, если ваши условия не выполняются, маршрут не будет удален.

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