Я работаю над проектом C#, и мы, чтобы добиться некоторого единства в разных частях нашего пользовательского интерфейса, пытаемся использовать шаблон MVC. Клиент основан на форме Windows, и я пытаюсь создать простую реализацию шаблона MVC.
Это оказалось сложнее, чем ожидалось, но у меня все еще есть некоторые вопросы относительно шаблона MVC. Проблема возникает в основном из-за отношений n-n между его компонентами: вот что я понял, но я не уверен во всем этом. Может кто меня поправит?
- Модель: может быть разделена между различными представлениями. 1-n связь между Model-View
- Вид: показывает состояние модели. только один контроллер (может быть общим для разных представлений?). Связь 1-1 с Моделью, связь 1-1 с контроллером
- Контроллер: обрабатывает действия пользователя в представлении и обновляет модель. Один контроллер может быть общим для разных представлений, контроллер взаимодействует только с одной моделью?
Я не уверен в двух последних:
- Может ли представление иметь несколько контроллеров? Или представление может совместно использовать контроллер с другим представлением? Или это только отношения 1:1?
- Может ли контроллер обрабатывать несколько представлений? может ли он взаимодействовать с несколькими моделями?
Кроме того, я воспользуюсь этим вопросом, чтобы задать другой вопрос, связанный с MVC. Я подавил все синхронные вызовы между различными членами MVC, используя события и делегаты. Последний вызов по-прежнему синхронен и на самом деле является самым важным: вызов между представлением и контроллером по-прежнему синхронен, так как мне нужно знать, смог ли контроллер обработать действие пользователя или нет. Это очень плохо, так как это означает, что я могу заблокировать поток пользовательского интерфейса (следовательно, сам клиент), пока контроллер обрабатывает или выполняет какую-то работу. Как я могу этого избежать? Я могу использовать обратный вызов, но как мне узнать, из какого события исходит обратный вызов?
PS: я не могу изменить шаблон на данном этапе, поэтому, пожалуйста, избегайте ответов типа «используйте MVP или MVVC и т. д.;)
Спасибо!