Должен ли я использовать шаблон Model-View-ViewModel (MVVM) в проектах Silverlight?
Одна проблема с элементами управления Silverlight заключается в том, что когда свойства привязаны к коду, они больше не редактируются в Blend. Например, если у вас есть ListView, который заполнен из фида данных, элементы управления не видны при редактировании элемента управления в Blend.
Я слышал, что шаблон MVVM, созданный сообществом разработчиков WPF, также может помочь сохранить элементы управления Silverlight "blendable". Я все еще обнимаю его, но вот несколько объяснений:
Одним из потенциальных недостатков является то, что шаблон требует дополнительных классов, хотя и не обязательно большего количества кода (как показано в приведенной выше ссылке). Мысли?
Ответы
Ответ 1
Я определенно думаю, что вы должны использовать шаблон MVVM для приложений Silverlight, и одним из преимуществ шаблона является то, что вы действительно можете сделать свое приложение действительно смешаным с помощью простых методов. Я часто ссылаюсь на "совместимость" как на "дизайн для удобства" - вы используете определенные методы, чтобы убедиться, что ваше приложение отлично выглядит в Blend.
Один из методов, как указывает Торбьёрн, - использовать платформу внедрения зависимостей и предоставлять различные реализации ваших внешних сервисов в зависимости от того, выполняется ли код в Blend или в браузере. Поэтому я настраиваю свой контейнер на использование фиктивного поставщика данных, когда код выполняется в Blend, и таким образом вы получаете поддержку времени разработки для своих списков, сетки данных и т.д.
Проблема заключается в том, как объявить DataContext декларативно - поэтому я часто заканчиваю использование класса локатора служб a "передним концом" в контейнере IoC. Таким образом, я могу привязать контекст данных к свойству в локаторе службы.
Другой метод - создать какой-то элемент управления ObjectDataSource (не визуальный), который имеет два свойства: Design Time DataContext и контекст данных RunTime. Элемент управления выполняет задачу определения места выполнения, а затем устанавливает родительский DataContext в правильный объект.
Ответ 2
Я не уверен, могу ли я ответить на ваш вопрос, но я считаю, что статья ниже очень ценна. Jonas Follesø использует ninject для переключения своих сервисов в режиме дизайна/смешивания. Очень приятно!
http://jonas.follesoe.no/YouCardRevisitedImplementingDependencyInjectionInSilverlight.aspx
Ответ 3
Я также согласен с Jonas относительно MVVM с Silverlight. Я действительно считаю, что MVP также является хорошим выбором, но недавно я успел попробовать MVP и MVVM с Silverlight, и я намного счастливее с результатами MVVM. (Да, я передумал, тем больше использовал MVVM). VM абстрагирует привязку Модели из представления (очевидно) в MVVM, что позволяет использовать сценарии более привязки (по крайней мере, более чистые способы их выполнения), чем с MVP. Это только один аспект.
Я буду размещать несколько примеров MVP и MVVM с Silverlight на моем сайте.
Ответ 4
Я пробовал несколько вариантов, и я полагаюсь на MVVM как лучший выбор для меня. Смешиваемость - важный момент, и я также нахожу виртуальный аспект интуитивно понятным для подстройки динамического поведения и процедурных эффектов и анимаций (например, Nikhil Silverlight.FX). В какой-то момент я старался избегать Blend в целом благодаря свободным интерфейсам, но нахожу, что связь между пользовательским интерфейсом и поведение слишком болезненны в долгосрочной перспективе. Я хочу создать свой интерфейс в Blend, а затем добавить эффекты и другое поведение в коде, это доказывает, что это лучший образец для меня, чтобы следовать до сих пор.
Ответ 5
Я думаю, что многие из нас ждут, чтобы первопроходцы пошли вперед и создали действительно хорошие примеры приложений, используя MVVM в Silverlight (и WPF, если на то пошло). Существует несколько сложных областей, таких как отсутствие ICommand в Silverlight или трудность взаимодействуя с анимацией, начиная и останавливаясь только с использованием привязки данных.
Это определенно образец, чтобы следить за будущим, и стоит попробовать, если вы не возражаете "обманывать" время от времени в тех местах, где вы не можете это понять.
Ответ 6
Я согласен с Jonas. MVVM кажется моделью, которая лучше всего подходит для меня (хотя Джон Папа считает, что MVP имеет больше смысла). У меня есть статья MSDN об этом в марте, которая, надеюсь, ответит на призыв к хорошему примеру.
Кстати, я хотел бы увидеть некоторую сплоченность в отделе MVVM Framework. Не существует хорошего решения для рамки, которой нужно следовать. Мне нравится Jonas (я думаю, что Jonas - это FX Framework), но поскольку его совместимость с WPF не может быть правильным выбором для некоторых.
Ответ 7
Мне нравится шаблон ViewModel и очень рекомендую его. В моем блоге есть несколько типов сообщений "Начало работы с ViewModel".
Ответ 8
В последнее время я использую MVVM в нескольких проектах Silverlight, и он работает очень хорошо, я бы определенно рекомендовал его. Jonas post - отличное место для начала, я недавно blogged на моем MVVM тоже переживает и создал действительно простое решение для демонстрации основных точек касания.
Ответ 9
Там очень хорошее введение в Techdays 2010 в шаблон MVVM, четко объяснено:
Для более сложных приложений, требующих более высокой степени автоматизированного тестирования, это определенно имеет смысл, и переход от зависимостей DependencyProperties к привязке DataContext намного опрятен, чем аналог ASP.NET.
Самая большая проблема, с которой я столкнулся в Silverlight, - это проверка фактического интерфейса (там, где я думаю), и огромная путаница вызовов событий, которые вы получаете при использовании служб WCF (или WebClient, если на то пошло) с Silverlight.
Ответ 10
Я всегда думал, что MVVM и PresntationModel http://martinfowler.com/eaaDev/PresentationModel.html - это, по сути, одно и то же. PresentationModel намного проще сказать.
Я использовал его успешно в java swing, формах окон, WPF и Silverlight. Если вы думаете с точки зрения разделения проблем, модель представления имеет большой смысл. У вас есть один класс, единственная проблема которого заключается в предоставлении дружественной к презентации модели. На самом деле не имеет значения, какая технология используется для показа на экране. Это может изменить некоторые детали реализации, но разделение проблем отдельно - хорошая идея независимо от того, как вы показываете информацию.
Из-за этого разделения вы можете легко писать тесты против своей модели презентации независимо от технологии просмотра. Так что плюс.
Ответ 11
С выпуском Prism v2 в феврале 2009 года P & P еще лучшая поддержка MVVM теперь доступна для Silverlight и WPF. Подробнее см. microsoft.com/compositewpf.
Ответ 12
Взгляните на мою статью о MVVM и Silverlight в реальных проектах и решите для себя.
http://alexburtsev.wordpress.com/2011/03/05/mvvm-pattern-in-silverlight-and-wpf/