Хотя я пометил это как вопрос java / spring, его легко можно задать для любой среды mvc с контроллерами без сохранения состояния. Я знаю, что rails использует простые контроллеры без сохранения состояния, так что, возможно, вы, ребята, знаете, как лучше всего решить эту проблему. Я могу лучше всего описать проблему с Java / Spring MVC, который является реализацией - простите Java Jargon.
Выпуск
У нас возникли проблемы с поиском удовлетворительного способа выполнения передачи состояния без состояния в весенний mvc.
В сущности, учитывая структуру, как:
Модель: Unit
С состояниями: отозвано, доступно, недоступно
И операции: getOutline()
и getHelp()
Контроллер: UnitController
с операциями: displayOutline()
и displayHelp()
Нам нужен способ проверить состояние устройства, прежде чем мы выполним операцию displayOutline()
(потому что само устройство может быть отозвано, и поэтому пользователь должен быть перенаправлен на удаленную страницу).
Мы пытались сделать это несколькими способами, включая:
Мертвый простой способ (любой язык)
Все методы в контроллере, для которых требуется «доступный» блок состояния, вызывают метод isAvailable () в первой строке его реализации. Очевидно, что здесь много репликации, она пахнет.
Способ AOP (специфичный для Java)
Может быть создан совет @Around под названием UnitAccess, который выполняет проверку и перенаправляет поток управления (то есть вместо вызова continue (), который вызовет базовый метод, который вызывает другой метод на контроллере). Это похоже на хак и не совсем то, что AOP, если для, он удаляет репликацию, но добавляет сложность и снижает прозрачность.
Перехватчик (предоставляется архитектурой сервлета, но, вероятно, выполнимо в других средах)
Который проверяет состояние устройства и существенно меняет фактический URL-вызов. Опять же это не кажется правильным. Нам не нравится идея вызова логики модели перед тем, как перейти к контроллеру.
Мы думали о
Шаблон команды
Создание структуры шаблона команды, которая (с использованием наследования) может возвращать изъятое представление или действительное представление displayOutline. Поскольку метод execute будет выполнять проверки в вызове super()
и конкретной логике внутри конкретных команд. Т.е. создание структуры объекта типа
DisplayOutlineCommand extends UnitCommand
public void execute(){
super();
// must be ok, perform getOutline()
}
И, наконец, использование пользовательского исключения
Вызов getAvailableUnit()
для объекта уровня обслуживания, который будет проверять наличие и т. Д. Перед возвратом устройства. Если юнит отозван, он выдаст исключение UnitWithdrawnException, которое может быть перехвачено сервлетом и обработано путем возврата соответствующего представления. Все еще не были убеждены. Нам также не нравится идея использовать исключение для нормального управления потоком.
Мы что-то упустили? Есть ли простой способ сделать это под пружиной / другой платформой контроллера без сохранения состояния?