Фреймворки для построения композитных приложений на WPF\SL
При создании композитных приложений на 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
Для тех, кто постоянно реализует во ViewModel интерфейс INotifyPropertyChanged. Clarius Consulting Labs выпустила утилиту ViewModel Tool, которая сгенерирует имплементацию интерфейса самостоятельно.
XAML Power Toys
XAML Power Toys – аддин для Visual Studio 2008 SP1 для разработчиков под Silverlight, WPF, облегчающий разработку генерацией XAML’а представений (View), а так же модели представления (ViewModel), со всем необходимыми бизнес-действиями и контролами.
Практикум Silverlight: Начинаем работать с Composite Application Library
Для кого эта статья
Данный пост будет интересен для вас если:
- Вы нацелены на развитие
- Вы работаете с RIA средой, такой как Silverlight (так же WPF)
- Если вы уже где-то слышали такие слова как Composite Application Guidance, Composite Application Library
- Вы заинтересовались статьей Павла Ивченкова “Создание приложения на WPF с использованием принципов TDD”
- Вам было интересно прочитать статью Acerv “Use 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 приложение для его хостинга. В результате должно получиться примерно следующее:
.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:
- <UserControl x:Class="HelloWorld.Silverlight.Shell"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Width="400" Height="300">
- <Grid x:Name="LayoutRoot" Background="White">
- </Grid>
- </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 добавим ссылку на пространство имён
- xmlns:Regions="clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation"
* This source code was highlighted with Source Code Highlighter.
а так же добавим контрол ItemsControl
- <UserControl x:Class="HelloWorld.Silverlight.Shell"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:Regions="clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation"
- Width="400" Height="300">
- <ItemsControl Name="MainRegion"/>
- </UserControl>
* This source code was highlighted with Source Code Highlighter.
так же добавим ему атрибут, указывающий RegionManager на текущий регион по имени “MainRegion”
- <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 к нашему проекту и определим наследование:
- class Bootstrapper : UnityBootstrapper
- {
- }
* This source code was highlighted with Source Code Highlighter.
Так же переопределим метод создания консоли CreateShell:
- protected override DependencyObject CreateShell()
- {
- Shell shell = Container.Resolve<Shell>();
- Application.Current.RootVisual = shell;
- return shell;
- }
* This source code was highlighted with Source Code Highlighter.
и определение каталога модулей:
- protected override IModuleCatalog GetModuleCatalog()
- {
- ModuleCatalog catalog = new ModuleCatalog();
- return catalog;
- }
* This source code was highlighted with Source Code Highlighter.
Так же необходимо провести инициализацию bootstrapper’а:
- private void Application_Startup(object sender, StartupEventArgs e)
- {
- Bootstrapper bootstrapper= new Bootstrapper();
- bootstrapper.Run();
- }
* This source code was highlighted with Source Code Highlighter.
Можно запустить проект и проверить.
2. Добавляем модуль (Module)
Module – функциональная, слабо связанная единица, предназначенная для комбинации в приложении.
Для этого нам необходимо добавить проект типа Silverlight Class Library и назвать его HelloWorldModule:
Добавляем ссылки на сборки:
- Microsoft.Practices.Composite.dll
- Microsoft.Practices.Composite.Presentation.dll
Переименовывем класс Class1 в HelloWorldModule и наследуем его от интерфейса Microsoft.Practices.Composite.Modularity.IModule:
- public class HelloWorldModule : IModule
- {
- public void Initialize() {}
- }
* This source code was highlighted with Source Code Highlighter.
Далее на необходимо зарегистрировать модуль в каталоге нашего Bootstrapper класса, немного изменив метод GetModuleCatalog:
- protected override IModuleCatalog GetModuleCatalog()
- {
- ModuleCatalog catalog = new ModuleCatalog()
- .AddModule(typeof(HelloWorldModule.HelloWorldModule));
- return catalog;
- }
* This source code was highlighted with Source Code Highlighter.
3. Добавляем представление (View)
Создадим в проекте нашего HelloWorldModule модуля папочку Views и добавим к нему Silverlight User Control под названием HelloWorldView, который будет нашим представлением. Немного подправим HelloWorldView.xaml:
- <UserControl x:Class="HelloWorldModule.Views.HelloWorldView"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
- <Grid x:Name="LayoutRoot" Background="White">
- <TextBlock Text="Hello World" Foreground="Green" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Calibri" FontSize="24" FontWeight="Bold"></TextBlock>
- </Grid>
- </UserControl>
* This source code was highlighted with Source Code Highlighter.
Region Manager – сервис для несвязанного сопоставления (только с помощью указания имён) представления и региона.
Добавим его в конструктор класса нашего модуля HelloWorldModule через dependency injection и сохраним в поле regionManager:
- public HelloWorldModule(IRegionManager regionManager)
- {
- this.regionManager = regionManager;
- }
* This source code was highlighted with Source Code Highlighter.
Так же зарегистрируем представление в регионе:
- public void Initialize()
- {
- regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.HelloWorldView));
- }
* This source code was highlighted with Source Code Highlighter.
Ну вот вроде и всё. Теперь можно запустить наше приложение:
В заключение
Итак, в этой статье вы узнали основы того, что содержится в Composite Application Guidance, а так же научитесь создавать составные Silverlight приложения на основе Composite Application Library (создадили загружаемый модуль (Module), а так же представление (View), которое отображается в конcоли (Shell)). Всё как и было обещано.
Источники
- Перед вами был слегка вольный и неполный перевод статьи из 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 - Скачать руководство и сорцы можно с http://www.codeplex.com/CompositeWPF/
Медиа-библиотека на WPF
Если вы нуждаетесь в приобретении практического опыта в разработке “насыщенных” настольных приложений, то я думаю вас должен заинтересовать проект Sonic, в статье, в подробностях посвященной циклу его разработки вы сможете обнаружить для себя нюансы реализации шаблона Model-View-ViewModel, разработки провайдеров для LINQ2SQL (IQueryProvider), разработки контролов, обработки действий пользователя и многое другое. Советую:
Про Twitter, WPF и прекрасное
В поисках вдохновения сегодня просматривал студии, занимающиеся WPF и Silverlight. Нашёл достаточное количество достойных, однако, одной из них хочется уделить большее внимание, это Thirteen23 http://www.thirteen23.com/index.html (советую посетить их веб-сайт и ознакомиться с работами, оно того стоит) и их продукту Blu.
Blu – это отличный настольный Twitter клиент, написанный на WPF.
Скачать его можно по адресу: http://www.thirteen23.com/experiences/desktop/blu/