Download - User interface process application block
User interface User interface process application process application
blockblock
Владимир ЧалковВладимир ЧалковCEOCEO
За какво ще говоримЗа какво ще говорим
Потребителски интерфейс – Потребителски интерфейс – проблеми и решенияпроблеми и решения
Приложение на Приложение на User interface User interface process APprocess AP
Microsoft application blocksMicrosoft application blocks ДемонстрацияДемонстрация
Основни проблемиОсновни проблеми
Пълно отделяне на потребителския Пълно отделяне на потребителския интерфейс от логиката и навигациятаинтерфейс от логиката и навигацията
Запазване на състоянието между Запазване на състоянието между различни компоненти и процесиразлични компоненти и процеси
Използване на един и същи модел в Използване на един и същи модел в различни типове приложенияразлични типове приложения
Създаване на “Създаване на “reusable” reusable” компоненти компоненти за потребителски интерфейсза потребителски интерфейс
Типично поведение при Типично поведение при Event-driven Event-driven технологиитехнологии
(1/2)(1/2) Навигацията се дефинира в Навигацията се дефинира в
OnClick OnClick събитиясъбития Всяка форма знае към коя е Всяка форма знае към коя е
следващатаследващата Навигацията е пръсната из целия Навигацията е пръсната из целия
кодкод Запазването на състоянието е Запазването на състоянието е
пръснато из целия кодпръснато из целия код
Типично поведение при Типично поведение при Event-driven Event-driven
технологиитехнологии(2/2)(2/2)
OnClickOnClick
OnDoubleClickOnDoubleClick
Model-view-controllerModel-view-controller
ModelModel Управлява и обработва Управлява и обработва
данните в приложениетоданните в приложението ViewView
Управлява визуализациятаУправлява визуализацията ControllerController
Управлява Управлява взаимодействието на взаимодействието на потребителя с потребителя с приложениетоприложението
Application blocksApplication blocks Показват как архитектурно се Показват как архитектурно се
подхожда към някои типични проблемиподхожда към някои типични проблеми Разпространяват се заедно със Разпространяват се заедно със
изходния код и могат да се използват изходния код и могат да се използват като основакато основа
Някои блокове:Някои блокове: Data access application blockData access application block Offline application blockOffline application block Configuration management application blockConfiguration management application block User interface process application blockUser interface process application block
User interface process User interface process blockblock
ЦелиЦели:: ““Развързване” на потребителския Развързване” на потребителския
интерфейс и навигациятаинтерфейс и навигацията Управление на състояниетоУправление на състоянието между между
различните компоненти и процесиразличните компоненти и процеси Независим от платформата модел за Независим от платформата модел за
Windows, Web Windows, Web ии мобилни приложениямобилни приложения Компоненти, които могат да се Компоненти, които могат да се
използват между проектиизползват между проекти
Основни функции (1/2)Основни функции (1/2)
Реализация на Реализация на MVCMVC Поддръжка на Поддръжка на Windows Windows и и Web Web
приложенияприложения Възможност за прехвърляне на Възможност за прехвърляне на
сесията между различни сесията между различни приложенияприложения
Използване на един и същи код Използване на един и същи код между различните типове между различните типове приложенияприложения
Основни функции (2/2)Основни функции (2/2)
State persistence providersState persistence providers Трансфер на Трансфер на Web Web сесиисесии Layout Layout мениджъримениджъри
Основни терминиОсновни термини
Navigation graphNavigation graph NavigatorNavigator State persistence providerState persistence provider TaskTask ControllerController
Controller Controller класакласа
Отговаря за общия контрол на Отговаря за общия контрол на потребителския интерфейспотребителския интерфейс
Съдържа методи за навигация, Съдържа методи за навигация, които формите извикваткоито формите извикват
Осигурява връзката с бизнес Осигурява връзката с бизнес компонентитекомпонентите
Осигурява съхраняване на Осигурява съхраняване на състоянието използвайки избрания състоянието използвайки избрания подходподход
НавигаториНавигатори GraphNavigatorGraphNavigator
Предварително дефиниран граф от Предварително дефиниран граф от възможните интерфейстивъзможните интерфейсти
OpenNavigatorOpenNavigator Определяне на навигацията без Определяне на навигацията без
предварително дефиниранепредварително дефиниране UserControlsNavigatorUserControlsNavigator
Навигация в рамките на една формаНавигация в рамките на една форма WizardNavigatorWizardNavigator
Реализация на типичния Реализация на типичния “Wizard” “Wizard” интерфейсинтерфейс
Запазване на Запазване на състояниетосъстоянието
ПроблемиПроблеми Състоянието на един потребителски Състоянието на един потребителски
процес или задача трябва да може да процес или задача трябва да може да се съхранявасе съхранява
Състоянието трябва да може да се Състоянието трябва да може да се съхранява и в дългосрочни носителисъхранява и в дългосрочни носители
Трябва да има нотификация, когато Трябва да има нотификация, когато състоянието се е променилосъстоянието се е променило
Persistence providersPersistence providers
IsolatedStoragePersistenceIsolatedStoragePersistence SecureIsolatedStoragePersistencSecureIsolatedStoragePersistenc
ee SqlServerPersistStateSqlServerPersistState SecureSqlServerPersistStateSecureSqlServerPersistState SessionStatePersistenceSessionStatePersistence MemoryStatePersistenceMemoryStatePersistence
Избор на Избор на persistence persistence providerprovider
Общата картинаОбщата картина
Дотъп до данните
Бизнес логика
WebFormView
ASP.NET страници
WebFormView
ASP.NET страници
WebFormView
ASP.NET страници
WinFormView
Windows Form
Вашия controller class
ASP.NET страници
WebFormView
ControllerBase
Data
XML файл
ASP.NET странициPersistence Provider
Вашия controller class
ASP.NET страници
State
Ваше състояние
ASP.NET странициUIP Manager
ASP.NET странициКонфигурация
ASP.NET странициView Manager
A user interface processA user interface process
frmListfrmList
frmMainfrmMain
frmPersonfrmPerson
start
end
previous
next
Начин на използване Начин на използване (1/2)(1/2)
Дефинират се всички процеси на Дефинират се всички процеси на потребителския интерфейспотребителския интерфейс
Дефинират се формите, които ще Дефинират се формите, които ще се показватсе показват
Променя се класа, който формите Променя се класа, който формите наследяватнаследяват
Начин на използване Начин на използване (2/2)(2/2)
Създава се Създава се Controller Controller класклас Избира се подходящия навигаторИзбира се подходящия навигатор Създава се конфигурационен Създава се конфигурационен
файл, който описва процеситефайл, който описва процесите
Промени по формитеПромени по формите
public class frmPerson : WindowsFormViewpublic class frmPerson : WindowsFormView{{
……..
private void frmPerson_Load(object sender, private void frmPerson_Load(object sender, EventArgs e)EventArgs e)
{{
this.txtFirst.Text = this.txtFirst.Text = TypeSafeController.CurrentPerson.Firstname;TypeSafeController.CurrentPerson.Firstname;
this.txtLast.Text = this.txtLast.Text = TypeSafeController.CurrentPerson.Lastname;TypeSafeController.CurrentPerson.Lastname;
Controller Controller класа (1/2)класа (1/2)public class MyController : ControllerBasepublic class MyController : ControllerBase{{
public ArrayList PersonList;public ArrayList PersonList;public Person CurrentPersonpublic Person CurrentPerson{{
getget{{
return return (Person)this.Navigator.CurrentState["CurrentPerson"];(Person)this.Navigator.CurrentState["CurrentPerson"];
}}setset{{
this.Navigator.CurrentState["CurrentPerson"]=value;this.Navigator.CurrentState["CurrentPerson"]=value;}}
}}
Controller Controller класа (2/2)класа (2/2)
public void frmListNewButton()public void frmListNewButton(){{
State.NavigateValue = "next";State.NavigateValue = "next";Navigate();Navigate();
}}
public void frmPersonEndButton()public void frmPersonEndButton(){{
State.NavigateValue = "previous";State.NavigateValue = "previous";Navigate();Navigate();
}}
Конфигурационен файл Конфигурационен файл (1/3)(1/3)
<navigationGraph name="MainNavigation" startView=“<navigationGraph name="MainNavigation" startView=“frmMainfrmMain" " state="State" statePersist="IsolatedStoragePersistence"state="State" statePersist="IsolatedStoragePersistence"iViewManager="WindowsFormViewManager">iViewManager="WindowsFormViewManager"><node view='frmList'><node view='frmList'><navigateTo navigateValue="next" view='frmPerson' /><navigateTo navigateValue="next" view='frmPerson' /><navigateTo navigateValue="end" view=<navigateTo navigateValue="end" view=‘frmMain‘frmMain' />' /></node></node><node view='frmPerson'><node view='frmPerson'><navigateTo navigateValue="previous“ view='frmList' /><navigateTo navigateValue="previous“ view='frmList' /></node></node><node view='Form1'><node view='Form1'><navigateTo navigateValue="Start" view='frmList' /><navigateTo navigateValue="Start" view='frmList' /></node></node>
</navigationGraph></navigationGraph>
Конфигурационен файл Конфигурационен файл (2/3)(2/3)
<<objectTypesobjectTypes>><<iViewManageriViewManager name="WindowsFormViewManager" name="WindowsFormViewManager"
type="Microsoft.ApplicationBlocks.UIProcess.WindowsFormViewMatype="Microsoft.ApplicationBlocks.UIProcess.WindowsFormViewManager, Microsoft.ApplicationBlocks.UIProcess, nager, Microsoft.ApplicationBlocks.UIProcess,
Version=1.0.1.0,Culture=neutral,PublicKeyToken=null" Version=1.0.1.0,Culture=neutral,PublicKeyToken=null" />/><<statestate name="State" name="State"
type="Microsoft.ApplicationBlocks.UIProcess.State, type="Microsoft.ApplicationBlocks.UIProcess.State, Microsoft.ApplicationBlocks.UIProcess, Microsoft.ApplicationBlocks.UIProcess, Version=1.0.1.0,Culture=neutral,PublicKeyToken=null" />Version=1.0.1.0,Culture=neutral,PublicKeyToken=null" />
<<controllercontroller name="MyController" name="MyController" type="Crossroad.UIPAB.Common.MyController, type="Crossroad.UIPAB.Common.MyController, Crossroad.UIPAB.Common, Crossroad.UIPAB.Common, Version=1.0.1.5,Culture=neutral,PublicKeyToken=null" />Version=1.0.1.5,Culture=neutral,PublicKeyToken=null" />
<<statePersistenceProviderstatePersistenceProvider name="IsolatedStoragePersistence" name="IsolatedStoragePersistence"
type="Microsoft.ApplicationBlocks.UIProcess.IsolatedStoragePetype="Microsoft.ApplicationBlocks.UIProcess.IsolatedStoragePersistence, rsistence, Microsoft.ApplicationBlocks.UIProcess, Microsoft.ApplicationBlocks.UIProcess, Version=1.0.1.0,Culture=neutral,PublicKeyToken=null" />Version=1.0.1.0,Culture=neutral,PublicKeyToken=null" />
</</objectTypesobjectTypes>>
Конфигурационен файл Конфигурационен файл (3/3)(3/3)
<<viewsviews>><<viewview name="frmPerson" type="Crossroad.UIPAB.UI.frmPerson, name="frmPerson" type="Crossroad.UIPAB.UI.frmPerson, Crossroad.UIPAB.UI, Crossroad.UIPAB.UI, Version=1.0.1.5,Culture=neutral,PublicKeyToken=null"Version=1.0.1.5,Culture=neutral,PublicKeyToken=null"
controller="MyController" stayOpen="false" controller="MyController" stayOpen="false" openModal="true" />openModal="true" /><<viewview name="frmList" type="Crossroad.UIPAB.UI.frmList, name="frmList" type="Crossroad.UIPAB.UI.frmList, Crossroad.UIPAB.UI, Crossroad.UIPAB.UI, Version=1.0.1.5,Culture=neutral,PublicKeyToken=null"Version=1.0.1.5,Culture=neutral,PublicKeyToken=null"
controller="MyController" stayOpen="false" controller="MyController" stayOpen="false" openModal="false" />openModal="false" /><<viewview name="frmMain" type="Crossroad.UIPAB.UI.frmMain, name="frmMain" type="Crossroad.UIPAB.UI.frmMain, Crossroad.UIPAB.UI, Crossroad.UIPAB.UI, Version=1.0.1.5,Culture=neutral,PublicKeyToken=null"Version=1.0.1.5,Culture=neutral,PublicKeyToken=null"
controller="MyController" stayOpen="false" controller="MyController" stayOpen="false" openModal="false" />openModal="false" />
</</viewsviews>>
Стартиране на процесаСтартиране на процеса
{{
UIPManager.NavigateEvent+=newMicrosoft.ApplicationUIPManager.NavigateEvent+=newMicrosoft.ApplicationBlBlocks.UIProcess.UIPManager.NavigateEventHandler(UIPocks.UIProcess.UIPManager.NavigateEventHandler(UIPMM anager_NavigateEvent);anager_NavigateEvent);
UIPManager.RegisterShutdown(this);UIPManager.RegisterShutdown(this);
UIPManager.StartNavigationTask("MainNavigation");UIPManager.StartNavigationTask("MainNavigation");this.Hide();this.Hide();
Навигация във Навигация във формитеформите
private void PersonsList_DoubleClick(object private void PersonsList_DoubleClick(object sender, System.EventArgs e)sender, System.EventArgs e)
{{
if (PersonsList.SelectedIndices.Count>0)if (PersonsList.SelectedIndices.Count>0)
{{
TypeSafeController.CurrentPerson=(Person)TyTypeSafeController.CurrentPerson=(Person)TypeSafeController.PersonList[PersonsList.SpeSafeController.PersonList[PersonsList.SelectedIndices[0]];electedIndices[0]];
TypeSafeController.frmListEdit();TypeSafeController.frmListEdit();
}}
}}
ДемонстрацияДемонстрация
Други възможностиДруги възможности
ILayoutManagerILayoutManager Възможност за т.н. Възможност за т.н. Layout ManagerLayout Manager
Кодиране на състояниетоКодиране на състоянието
ОбобщениеОбобщение
Реализира Реализира MVC MVC шаблонашаблона Позволява отделяне на навигацията Позволява отделяне на навигацията
и данните от потребителския и данните от потребителския интерфейсинтерфейс
Предоставя стандартен подход за Предоставя стандартен подход за съхраняване на състояниетосъхраняване на състоянието
Архитектурен подход, който трябва Архитектурен подход, който трябва да се прецени кога е подходящда се прецени кога е подходящ
ВръзкиВръзки
http://www.microsoft.com/patternshttp://www.microsoft.com/patterns http://msdn.microsoft.comhttp://msdn.microsoft.com http://www.gotdotnet.comhttp://www.gotdotnet.com News://News://
microsoft.public.bg.developermicrosoft.public.bg.developer Сървър: Сървър: news.micrsoft.comnews.micrsoft.com
Q & AQ & A