Практикум 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/
    Поделиться публикацией

    Комментарии 13

      0
      Статья отличная, и перевод понравился. Зная Ваш интерес к CAB, это ожидаемо. Спасибо.

      Один только вопрос — зачем Вы копипастите сюда целиком одну за одной статьи из своего блога? Может, проще ставить ссылки?
        0
        Спасибо! Я копирую сюда сугубо технологические статьи, но задумаюсь над вашим предложением делать анонсы на свой блог
          0
          Скинте пожалуйста ссылку на ваш блог. Можно в личку…

          PS: Давно хотел порыть в сторону CAB. Спасибо! :)

          PPS: А статьи копипастите на здоровье. Все равно никто ничего не пишет. Особенно по Silverlight.
            0
            Мой блог: butaji.wordpress.com/
              0
              Да это не CAB :) Это CAL :) Две абсолютно разные вещи.
          0
          Спасибо за статью.
            0
            Отлично, что вы поднимаете эту тему на хабре

            Но, на мой взгляд, стоило бы побольше времени уделить теории, рассказать про концепции prism v2, чем оно так хорошо и для чего оно нужно. Например, про то, что можно сильно шарить код между Silverlight и толстым WPF приложением, и проч.

            Чем сразу кидатся в код (тем более что это просто перевод Hand-on Labs из хелпа).

            Для человека, кто хочет разобраться в этой технолоии, это было бы более полезно (имхо).

            Не очень поятно, для какой это версии? Ссылка на CAL идет на предыдущую версию, уже есть Feb 2009 release.
              0
              Всё делалось на февральской версии, тенденцию уловил, думаю продолжение быть должно.
              0
              2. Вы работаете с RIA средой, такой как Silverlight (так же WTF)
                0
                За ссылку спасибо:)
                  0
                  Этот перевод не положил продолжения тематики в ваших блогах? Хочу рассмотреть чем так хорош этот модульный подход в разработке приложений, собственно дает ли он ушустрение в разработки или производительности или наоборот ее снижает и т.п.
                  Вообще есть ли практика применения?
                    +1
                    пост был написан по мотивам проекта на Silverlight + CAL весной этого года; есть альтернатива для CAL: www.codeplex.com/caliburn; скорость разработки возросла несомненно, т.к. часть задач была реализована во фреймворке
                      0
                      Понял. Спасибо. Посмотрю тоже, а то все что то мимо проходил. Все сами да сами…

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое