Фреймворки для построения композитных приложений на WPF\SL

image[10]

При создании композитных приложений на WPF\SL частенько приходится реализовывать паттерн Model-View-ViewModel, в его имплементации может помочь несколько довольно таки неплохих фреймворков:

  • Caliburn (поддерживает паттерны: MVC, MVP, Presentation Model (MVVM), Commands и Application Controller; TDD, IoC-контейнер дружелюбен)
  • nRoute (так же достаточно мощный фреймворк)
  • Onyx (чуть проще, таргет на MVVM паттерн)
  • Prism/Composite WPF (сильный фреймворк от patterns and practices)

ViewModel Tool

image

Для тех, кто постоянно реализует во ViewModel интерфейс INotifyPropertyChanged. Clarius Consulting Labs выпустила утилиту ViewModel Tool, которая сгенерирует имплементацию интерфейса самостоятельно.


XAML Power Toys

XAML Power Toys – аддин для Visual Studio 2008 SP1 для разработчиков под Silverlight, WPF, облегчающий разработку генерацией XAML’а представений (View), а так же модели представления (ViewModel), со всем необходимыми бизнес-действиями и контролами.

imageПодробнее узнать можно здесь:

http://karlshifflett.wordpress.com/xaml-power-toys/


Практикум Silverlight: Начинаем работать с Composite Application Library

Для кого эта статья

Данный пост будет интересен для вас если:

  1. Вы нацелены на развитие
  2. Вы работаете с RIA средой, такой как Silverlight (так же WPF)
  3. Если вы уже где-то слышали такие слова как Composite Application Guidance, Composite Application Library
  4. Вы заинтересовались статьей Павла ИвченковаСоздание приложения на WPF с использованием принципов TDD 
  5. Вам было интересно прочитать статью AcervUse Case Driven Development и Composite UI Application Block

Цель статьи

В этой статье вы узнаете основы того, что содержится в Composite Application Guidance, а так же научитесь создавать составные Silverlight приложения на основе Composite Application Library (создадите загружаемый модуль (Module), а так же представление (View), которое отобразите в конcоли (Shell))

Приготовимся

В данной статье нам понадобятся следующие сборки из комплекта Composite Application Library и Unity Application Block:

  • Microsoft.Practices.Composite.dll
  • Microsoft.Practices.Composite.Presentation.dll
  • Microsoft.Practices.Composite.UnityExtensions.dll
  • Microsoft.Practices.ServiceLocation.dll
  • Microsoft.Practices.Unity.dll

Composite Application Library распространяется в виде исходных кодов, в связи с этим необходимо скомпилировать следующие сборки:

  • Microsoft.Practices.Composite.dll
  • Microsoft.Practices.Composite.Presentation.dll
  • Microsoft.Practices.Composite.UnityExtensions.dll

Для этого следует запустить исполняемый файл из комплекта

Desktop & Silverlight — Open Composite Application Library.bat

и сбилдить проект в Visual Studio, далее необходимые сборки можно найти в следующей каталоге

CAL\Silverlight\Composite.UnityExtensions\bin\Debug

Приступим

1. Создаём проект с приложением Shell

Для начала создадим Silverlight Application приложение, назовём его HelloWorld.Silverlight, так же не забудем добавить ASP.NET Web приложение для его хостинга. В результате должно получиться примерно следующее:

Dd458947.1153f195-a8e1-43e4-a307-877d6823e346(en-us,MSDN.10).png

Далее добавляем ссылки на необходимые нам сборки:

  • Microsoft.Practices.Composite.dll
  • Microsoft.Practices.Composite.Presentation.dll
  • Microsoft.Practices.Composite.UnityExtensions.dll
  • Microsoft.Practices.Unity.dll
  • Microsoft.Practices.ServiceLocation.dll

Далее нам необходимо создать консоль (Shell) нашего приложения, для этого переименуем Page.xaml в Shell.xaml, а так же изменим название класса в Shell.xaml.cs c Page на Shell.

Так же нам потребуется изменить файл Shell.xaml:

  1. <UserControl x:Class="HelloWorld.Silverlight.Shell"
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.     Width="400" Height="300">
  5.     <Grid x:Name="LayoutRoot" Background="White">
  6.  
  7.     </Grid>
  8. </UserControl>

* This source code was highlighted with Source Code Highlighter.

Далее нам необходимо узнать, что такое регион (region) и как мы его будем использовать.

Регион (Region) – концептуальный механизм, используемый разработчиками для отображения представлений (view) в определенном месте контрола, а так же для динамической подмены представлений (view).

В качестве хостинга для региона (region) могут использоваться следующие контролы:

  • System.Windows.Controls.ContentControl
  • System.Windows.Controls.ItemsControl
  • System.Windows.Controls.Primitives.Selector
  • System.Windows.Controls.TabControl

Подробнее о регионах (region) можно прочитать по ссылке http://msdn.microsoft.com/en-us/library/dd458944(printer).aspx

Для того, чтобы добавить регион в нашу консоль, мы будем использовать ItemsControl. В Shell.xaml добавим ссылку на пространство имён

  1. xmlns:Regions="clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation"

* This source code was highlighted with Source Code Highlighter.

а так же добавим контрол ItemsControl

  1. <UserControl x:Class="HelloWorld.Silverlight.Shell"
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.              xmlns:Regions="clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation"
  5.              Width="400" Height="300">
  6.     <ItemsControl Name="MainRegion"/>
  7. </UserControl>

* This source code was highlighted with Source Code Highlighter.

так же добавим ему атрибут, указывающий RegionManager на текущий регион по имени “MainRegion”

  1. <ItemsControl Name="MainRegion" Regions:RegionManager.RegionName="MainRegion"/>

* This source code was highlighted with Source Code Highlighter.

Bootstrapper

Bootstrapper – механизм для компоновки компонентов нашего приложения.

Мы создадим свой класс bootstrapper на основе присутствующего в Composite Application Library абстрактного класса UnityBootstrapper, который инициализирует компоненты с помощью контейнера Unity, для этого добавим файл Bootstrapper.cs к нашему проекту и определим наследование:

  1. class Bootstrapper : UnityBootstrapper
  2. {
  3. }

* This source code was highlighted with Source Code Highlighter.

Так же переопределим метод создания консоли CreateShell:

  1. protected override DependencyObject CreateShell()
  2. {
  3.     Shell shell = Container.Resolve<Shell>();
  4.     Application.Current.RootVisual = shell;
  5.     return shell;
  6. }

* This source code was highlighted with Source Code Highlighter.

и определение каталога модулей:

  1. protected override IModuleCatalog GetModuleCatalog()
  2. {
  3.     ModuleCatalog catalog = new ModuleCatalog();
  4.     return catalog;
  5. }

* This source code was highlighted with Source Code Highlighter.

Так же необходимо провести инициализацию bootstrapper’а:

  1. private void Application_Startup(object sender, StartupEventArgs e)
  2. {
  3.     Bootstrapper bootstrapper= new Bootstrapper();
  4.     bootstrapper.Run();
  5. }

* This source code was highlighted with Source Code Highlighter.

Можно запустить проект и проверить.

2. Добавляем модуль (Module)

Module – функциональная, слабо связанная единица, предназначенная для комбинации в приложении.

Для этого нам необходимо добавить проект типа Silverlight Class Library и назвать его HelloWorldModule:

image

Добавляем ссылки на сборки:

  • Microsoft.Practices.Composite.dll
  • Microsoft.Practices.Composite.Presentation.dll

Переименовывем класс Class1 в HelloWorldModule и наследуем его от интерфейса Microsoft.Practices.Composite.Modularity.IModule:

  1. public class HelloWorldModule : IModule
  2. {
  3.  public void Initialize() {}
  4. }

* This source code was highlighted with Source Code Highlighter.

Далее на необходимо зарегистрировать модуль в каталоге нашего Bootstrapper класса, немного изменив метод GetModuleCatalog:

  1. protected override IModuleCatalog GetModuleCatalog()
  2. {
  3.   ModuleCatalog catalog = new ModuleCatalog()
  4.       .AddModule(typeof(HelloWorldModule.HelloWorldModule));
  5.   return catalog;
  6. }

* This source code was highlighted with Source Code Highlighter.

3. Добавляем представление (View)

Создадим в проекте нашего HelloWorldModule модуля папочку Views  и добавим к нему Silverlight User Control под названием HelloWorldView, который будет нашим представлением. Немного подправим HelloWorldView.xaml:

  1. <UserControl x:Class="HelloWorldModule.Views.HelloWorldView"
  2.   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  4.   <Grid x:Name="LayoutRoot" Background="White">
  5. <TextBlock Text="Hello World" Foreground="Green" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Calibri" FontSize="24" FontWeight="Bold"></TextBlock>
  6.   </Grid>
  7. </UserControl>

* This source code was highlighted with Source Code Highlighter.

Region Manager – сервис для несвязанного сопоставления (только с помощью указания имён) представления и региона.

Добавим его в конструктор класса нашего модуля HelloWorldModule через dependency injection и сохраним в поле regionManager:

  1. public HelloWorldModule(IRegionManager regionManager)
  2. {
  3.  this.regionManager = regionManager;
  4. }

* This source code was highlighted with Source Code Highlighter.

Так же зарегистрируем представление в регионе:

  1. public void Initialize()
  2. {
  3.   regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.HelloWorldView));
  4. }

* This source code was highlighted with Source Code Highlighter.

Ну вот вроде и всё. Теперь можно запустить наше приложение:

image

В заключение

Итак, в этой статье вы узнали основы того, что содержится в Composite Application Guidance, а так же научитесь создавать составные Silverlight приложения на основе Composite Application Library (создадили загружаемый модуль (Module), а так же представление (View), которое отображается в конcоли (Shell)). Всё как и было обещано.

Источники

  1. Перед вами был слегка вольный и неполный перевод статьи из Patterns&Practices “Composite Application Guidance for WPF and Silverlight — February 2009”
    Silverlight Hands-On Lab: Getting Started with the Composite Application Library найти её можно по адресу http://msdn.microsoft.com/en-us/library/dd458947(printer).aspx
  2. Скачать руководство и сорцы можно с http://www.codeplex.com/CompositeWPF/

Медиа-библиотека на WPF

Если вы нуждаетесь в приобретении практического опыта в разработке “насыщенных” настольных приложений, то я думаю вас должен заинтересовать проект Sonic, в статье, в подробностях посвященной циклу его разработки вы сможете обнаружить для себя нюансы реализации шаблона Model-View-ViewModel, разработки провайдеров для LINQ2SQL (IQueryProvider), разработки контролов, обработки действий пользователя и многое другое. Советую:

http://www.codeproject.com/KB/smart/Sonic.aspx

son[1]


Про Twitter, WPF и прекрасное

В поисках вдохновения сегодня просматривал студии, занимающиеся WPF и Silverlight. Нашёл достаточное количество достойных, однако, одной из них хочется уделить большее внимание, это Thirteen23 http://www.thirteen23.com/index.html (советую посетить их веб-сайт и ознакомиться с работами, оно того стоит) и их продукту Blu.

screens[1]

Blu – это отличный настольный Twitter клиент, написанный на WPF.

Скачать его можно по адресу: http://www.thirteen23.com/experiences/desktop/blu/