330 likes | 489 Views
User interface process application block. Владимир Чалков CEO. За какво ще говорим. Потребителски интерфейс – проблеми и решения Приложение на User interface process AP Microsoft application blocks Демонстрация. Основни проблеми.
E N D
User interface process application block Владимир Чалков CEO
За какво ще говорим • Потребителски интерфейс – проблеми и решения • Приложение на User interface process AP • Microsoft application blocks • Демонстрация
Основни проблеми • Пълно отделяне на потребителския интерфейс от логиката и навигацията • Запазване на състоянието между различни компоненти и процеси • Използване на един и същи модел в различни типове приложения • Създаване на “reusable” компоненти за потребителски интерфейс
Типично поведение при Event-driven технологии (1/2) • Навигацията се дефинира в OnClick събития • Всяка форма знае към коя е следващата • Навигацията е пръсната из целия код • Запазването на състоянието е пръснато из целия код
Типично поведение при Event-driven технологии(2/2) OnClick OnDoubleClick
Model-view-controller • Model • Управлява и обработва данните в приложението • View • Управлява визуализацията • Controller • Управлява взаимодействието на потребителя с приложението
Application blocks • Показват как архитектурно се подхожда към някои типични проблеми • Разпространяват се заедно със изходния код и могат да се използват като основа • Някои блокове: • Data access application block • Offline application block • Configuration management application block • User interface process application block
User interface process block • Цели: • “Развързване” на потребителския интерфейс и навигацията • Управление на състояниетомежду различните компоненти и процеси • Независим от платформата модел за Windows, Web имобилни приложения • Компоненти, които могат да се използват между проекти
Основни функции (1/2) • Реализация на MVC • Поддръжка на Windows и Web приложения • Възможност за прехвърляне на сесията между различни приложения • Използване на един и същи код между различните типове приложения
Основни функции (2/2) • State persistence providers • Трансфер на Web сесии • Layout мениджъри
Основни термини • Navigation graph • Navigator • State persistence provider • Task • Controller
Controller класа • Отговаря за общия контрол на потребителския интерфейс • Съдържа методи за навигация, които формите извикват • Осигурява връзката с бизнес компонентите • Осигурява съхраняване на състоянието използвайки избрания подход
Навигатори • GraphNavigator • Предварително дефиниран граф от възможните интерфейсти • OpenNavigator • Определяне на навигацията без предварително дефиниране • UserControlsNavigator • Навигация в рамките на една форма • WizardNavigator • Реализация на типичния “Wizard” интерфейс
Запазване на състоянието • Проблеми • Състоянието на един потребителски процес или задача трябва да може да се съхранява • Състоянието трябва да може да се съхранява и в дългосрочни носители • Трябва да има нотификация, когато състоянието се е променило
Persistence providers • IsolatedStoragePersistence • SecureIsolatedStoragePersistence • SqlServerPersistState • SecureSqlServerPersistState • SessionStatePersistence • MemoryStatePersistence
A user interface process frmMain start end previous frmList frmPerson next
Начин на използване (1/2) • Дефинират се всички процеси на потребителския интерфейс • Дефинират се формите, които ще се показват • Променя се класа, който формите наследяват
Начин на използване (2/2) • Създава се Controller клас • Избира се подходящия навигатор • Създава се конфигурационен файл, който описва процесите
Промени по формите public class frmPerson : WindowsFormView { …. private void frmPerson_Load(object sender, EventArgs e) { this.txtFirst.Text = TypeSafeController.CurrentPerson.Firstname; this.txtLast.Text = TypeSafeController.CurrentPerson.Lastname;
Controller класа (1/2) public class MyController : ControllerBase { public ArrayList PersonList; public Person CurrentPerson { get { return (Person)this.Navigator.CurrentState["CurrentPerson"]; } set { this.Navigator.CurrentState["CurrentPerson"]=value; } }
Controller класа (2/2) public void frmListNewButton() { State.NavigateValue = "next"; Navigate(); } public void frmPersonEndButton() { State.NavigateValue = "previous"; Navigate(); }
Конфигурационен файл (1/3) <navigationGraph name="MainNavigation" startView=“frmMain" state="State" statePersist="IsolatedStoragePersistence" iViewManager="WindowsFormViewManager"> <node view='frmList'> <navigateTo navigateValue="next" view='frmPerson' /> <navigateTo navigateValue="end" view=‘frmMain' /> </node> <node view='frmPerson'> <navigateTo navigateValue="previous“ view='frmList' /> </node> <node view='Form1'> <navigateTo navigateValue="Start" view='frmList' /> </node> </navigationGraph>
Конфигурационен файл (2/3) <objectTypes> <iViewManager name="WindowsFormViewManager" type="Microsoft.ApplicationBlocks.UIProcess.WindowsFormViewManager, Microsoft.ApplicationBlocks.UIProcess, Version=1.0.1.0,Culture=neutral,PublicKeyToken=null" /> <state name="State" type="Microsoft.ApplicationBlocks.UIProcess.State, Microsoft.ApplicationBlocks.UIProcess, Version=1.0.1.0,Culture=neutral,PublicKeyToken=null" /> <controller name="MyController" type="Crossroad.UIPAB.Common.MyController, Crossroad.UIPAB.Common, Version=1.0.1.5,Culture=neutral,PublicKeyToken=null" /> <statePersistenceProvider name="IsolatedStoragePersistence" type="Microsoft.ApplicationBlocks.UIProcess.IsolatedStoragePersistence, Microsoft.ApplicationBlocks.UIProcess, Version=1.0.1.0,Culture=neutral,PublicKeyToken=null" /> </objectTypes>
Конфигурационен файл (3/3) <views> <view name="frmPerson" type="Crossroad.UIPAB.UI.frmPerson, Crossroad.UIPAB.UI, Version=1.0.1.5,Culture=neutral,PublicKeyToken=null" controller="MyController" stayOpen="false" openModal="true" /> <view name="frmList" type="Crossroad.UIPAB.UI.frmList, Crossroad.UIPAB.UI, Version=1.0.1.5,Culture=neutral,PublicKeyToken=null" controller="MyController" stayOpen="false" openModal="false" /> <view name="frmMain" type="Crossroad.UIPAB.UI.frmMain, Crossroad.UIPAB.UI, Version=1.0.1.5,Culture=neutral,PublicKeyToken=null" controller="MyController" stayOpen="false" openModal="false" /> </views>
Стартиране на процеса { UIPManager.NavigateEvent+=newMicrosoft.ApplicationBl ocks.UIProcess.UIPManager.NavigateEventHandler(UIPM anager_NavigateEvent); UIPManager.RegisterShutdown(this); UIPManager.StartNavigationTask("MainNavigation"); this.Hide();
Навигация във формите private void PersonsList_DoubleClick(object sender, System.EventArgs e) { if (PersonsList.SelectedIndices.Count>0) { TypeSafeController.CurrentPerson=(Person)TypeSafeController.PersonList[PersonsList.SelectedIndices[0]]; TypeSafeController.frmListEdit(); } }
Други възможности • ILayoutManager • Възможност за т.н. Layout Manager • Кодиране на състоянието
Обобщение • Реализира MVC шаблона • Позволява отделяне на навигацията и данните от потребителския интерфейс • Предоставя стандартен подход за съхраняване на състоянието • Архитектурен подход, който трябва да се прецени кога е подходящ
Връзки • http://www.microsoft.com/patterns • http://msdn.microsoft.com • http://www.gotdotnet.com • News://microsoft.public.bg.developer • Сървър: news.micrsoft.com