контекст:
Я создаю приложение Javafx + Spring Boot с использованием шаблона MVVM:
Просмотры поддерживаются контроллерами. /> < /li>
Услуги обрабатывают бизнес -логику. < /p>
< /li>
< /ul>
Я хочу поддерживать разделение проблем и сохранять связь между ViewModels и службами модульных и тестируемых. SharedLoginViewModel, который управляет состоянием рабочего процесса (например: переключение между различными формами входа в систему или шагами создания токенов). < /P>
В одно и то же время, токно, обрабатывает логику для создания токенов (например, валидация формы, подчиняющаяся токен). SharedLoginViewModel для продвижения рабочего процесса (например, после успешного создания токена). TokenCreationViewModel. < /P>
Попытки подходов: < /p> 1. Прямая ссылка
Pros: простой, простой для отслеживания.
минусы: вызывает жесткую связь и круглые зависимости, когда несколько видовых моделей должны общаться. 2. Весенние события < /strong> < /p>
Pros: Декулируют компоненты, позволяют гибко общаться. Прямая, нисходящая цепочка связи.
В MVVM я предпочитаю четкий путь (контроллер → ViewModel → Service), который легко проследить и отладить.
Spring Events хорошо работают для проблем с бэкэнд (например, аудит), но чувствуйте себя как излишние для UI-связанных рабочих процессов. Пользовательский интерфейс (текущее решение)
Я представил интерфейс loginnavigationservice, чтобы отделить логику навигации от общей видоизоля. /> Определите интерфейс: < /p>
[b] контекст: [/b] Я создаю приложение Javafx + Spring Boot с использованием шаблона MVVM: [list] [*] Просмотры поддерживаются контроллерами. /> < /li> Услуги обрабатывают бизнес -логику. < /p> < /li> < /ul> Я хочу поддерживать разделение проблем и сохранять связь между ViewModels и службами модульных и тестируемых. SharedLoginViewModel, который управляет состоянием рабочего процесса (например: переключение между различными формами входа в систему или шагами создания токенов). < /P> В одно и то же время, токно, обрабатывает логику для создания токенов (например, валидация формы, подчиняющаяся токен). SharedLoginViewModel для продвижения рабочего процесса (например, после успешного создания токена). TokenCreationViewModel. < /P> Попытки подходов: < /p> [b] 1. Прямая ссылка [/b] Pros: простой, простой для отслеживания. минусы: вызывает жесткую связь и круглые зависимости, когда несколько видовых моделей должны общаться. [b] 2. Весенние события < /strong> < /p> Pros: Декулируют компоненты, позволяют гибко общаться. Прямая, нисходящая цепочка связи. В MVVM я предпочитаю четкий путь (контроллер → ViewModel → Service), который легко проследить и отладить. Spring Events хорошо работают для проблем с бэкэнд (например, аудит), но чувствуйте себя как излишние для UI-связанных рабочих процессов. Пользовательский интерфейс (текущее решение) [/b] Я представил интерфейс loginnavigationservice, чтобы отделить логику навигации от общей видоизоля. /> Определите интерфейс: < /p> [code] public interface LoginNavigationService { void advanceStep(); void cancel(); } < /code> < /li> Реализовать интерфейс в SharedloginViewModel < /p> @Component public class SharedLoginViewModel implements LoginNavigationService { // Existing workflow logic...
@Override public void advanceStep() { advanceLoginStep(); // Internal method to move workflow forward }
@Override public void cancel() { cancelWorkflow(); // Internal method to reset workflow } } < /code> < /li> Внедрить интерфейс (не полный sharedloginviewmodel) в TokenCreationViewModel < /p> @Component public class TokenCreationViewModel { private final LoginNavigationService navigationService;
@Autowired public TokenCreationViewModel(LoginNavigationService navigationService) { this.navigationService = navigationService; }
public void onTokenCreated() { // After token creation logic... navigationService.advanceStep(); // Decoupled navigation call } } [/code]
[b] Альтернативное рассмотрение: слушатель против интерфейса [/b] Я также рассматривал использование слушателей между ViewModels, например: [code]tokenCreationViewModel.setOnTokenCreated(() -> sharedLoginViewModel.advanceStep()); [/code] [b] Почему я избегал этого [/b]
[*] Создает жесткую связь между ViewModels. /> [b] почему интерфейс чувствовал себя чище < /strong> < /p>
Входной ряд, связанный с навигацией, связанный с навигацией. Логика.
[/list] Вопрос [/b] Это подход, основанный на интерфейсе, хорошая практика?>