Upload
internet
View
121
Download
1
Embed Size (px)
Citation preview
Composite Applicatin Guidance
Para Windows Presentation Foundation
Vasco Oliveira
Team Leader, Microfil
Agenda
• O que é o Prism?• Modularidade• Composição UI• Padrões de Apresentação• Referências
Prism – Porquê?
• Problemáticas:– Aplicações cliente são um desafio– Como as tornar dinâmicas, customizáveis,
extensíveis e fácilmente testáveis?
• Solução:– Segmentar a aplicação– Gerir interdependências– Compôr a aplicação dinâmicamente
• Prism - Patterns For Composite Client Apps
Prism – "What's in the box"?
• Prism 1.0 – WPF– Lançado em Julho de 2008
• Prism 2.0 – WPF e Silverlight– Q1 2009 – (Actualmente na Drop 10)
• Prism – Composite Client Application Guidance para WPF e Silverlight– Libraries– Reference Implementations (RI)– Documentação– Quick-Starts e How-To’s– Comunidade – CodePlex
• File -> Open ->CWPF\Source\StockTraderRI\StockTraderRI.sln
• Abrir o Visual Studio
In the box: Reference Implementation
Compor UI - RegiõesCompor UI - Regiões
Composite Application Guidance: Conceitos
Bootstrapper
DI/IoC Containers
Módulos
Shell e View
Eventos e Comandos
Bootstrapper
DI/IoC Containers
Módulos
Shell e View
Eventos e Comandos
Bootstrapper
Bootstrapper
• Responsável pela inicialização• Fases:
– Configuração– Regiões– Shell– Módulo
Container
Container
• CAL suporta vários DI Containers– IContainerFacade
• Implementação Unity– UnityContainerAdapter
Módulos
Módulos – O que são?
• Assemblies da aplicação– Colecção de componentes relacionados– Serviços, UI, Acesso a dados
• Unidade de desenvolvimento– Desenvolvimento independente– Testes independentes
Módulos - Carregamento• ModuleLoader - Catalogo de Modulos• Loading estático, por configuração, dinâmico• Inicialização em background ou On-Demand
Module Loader
Módulos
• Critérios de segmentação:– Funcionalidades específicas– Sub-sistemas– Serviços– Sistemas Line of Business
• Separação de equipas
Módulos – Loading estático
public class MyBootstrapper : UnityBootstrapper{ ... protected override IModuleEnumerator GetModuleEnumerator() { return new StaticModuleEnumerator() .AddModule(typeof(SomeModule)) .AddModule(typeof(AnotherModule), "SomeModule") .AddModule(typeof(YetAnotherModule), "AnotherModule","SomeModule"); }}
Dependências
Module Type
Localiza MódulosRetorna módulos
Referenciados estáticamente
Módulos - Inicialização
public class SomeModule : IModule public SomeModule(SomeDependency myDependency) {...} public void Initialize() { RegisterViewsAndServices(); //Show views here; }}
Dependência injectada
Lógica de Inicialização
Dividir uma aplicação em módulos por configuração
demo
Módulos – Loading Dinâmico
public class MyBootstrapper : UnityBootstrapper{ ... protected override IModuleEnumerator GetModuleEnumerator() { return new DirectoryLookupModuleEnumerator(@".\Modules"); }}
“Hot folder”
Loading dinâmico de módulos
demo
Composição do UI
Regiões• Shell – Janela “Host” da aplicação• Regions – Áreas definidas para injecção de
Views• Views – UI e lógica de apresentação
Region Region
Region
<ContentControl RegionManager.RegionName= “DetailsRegion” />
IPortfolioPresentationModel presentationModel = …;
IRegion mainRegion = regionManager.Regions[ "MainRegion" ];
mainRegion.Add( presentationModel.View );
<ItemsControl RegionManager.RegionName= "MainRegion">
Regiões – Registo
MyShell.xaml
RegionName attached property
Maior parte das vezes, Regions são
ItemsControls<TabControl x:Name="OrderTab" ItemContainerStyle="..." CAL:RegionManager.RegionName="OrderRegion" />
Regiões – Exibição
public class MyModule : IModule{ public void Initialize (IRegionManager manager) { RegisterViewsAndServices();
IRegion orderRegion = manager.GetRegion("OrderRegion"); var myOrderView = new OrderView(myOrder); orderRegion.Add(myOrderView); }}
RegionManager é necessário
Inicialização da View
Obtenção da Região
View é exibida
Regiões – Templating ("WPF way")
public class MyModule : IModule{ public void Initialize(IRegionManager manager) { RegisterViewsAndServices();
IRegion orderRegion = manager.GetRegion("OrderRegion"); orderRegion.Add(myOrder); }}
Objecto é adicionado directamente
Compondo o UI com Regions e Views
demo
Commands
Commands
Submit
OrderDetails
Submit
OrderDetails
Submit
OrderDetails
Delegate Commands
Composite Command
Submit All
Commands - Binding
<StackPanel Orientation="Horizontal"> <Button Name="SubmitAllToolbarButton" Command="{x:Static inf:Commands.SubmitOrdersCommand}"> Submit All </Button></StackPanel
Atribuir Command
public class OrderDetailsPresenter : IOrderDetailsPresenter{ private ICommand orderSubmitCommand;
public OrderDetailsPresenter(...) { orderSubmitCommand = …
// Register the commandCommands.SubmitOrdersCommand.RegisterCommand(orderSubmitCommand); }}
CompositeCommands - Registar
Registar command como filho
Commands - Handling
public class OrderDetailsPresenter : IOrderDetailsPresenter{ private ICommand orderSubmitCommand;
public OrderDetailsPresenter (IOrderDetailsView view, { orderSubmitCommand = new DelegateCommand(Submit, CanSubmit);
// Register the command Commands.SubmitOrdersCommand.RegisterCommand(orderSubmitCommand); }
public void Submit(object params) {...}
public bool CanSubmit(object params) {...}
}
Tratar Execute e CanExecute
Usando Commands para lidar com eventos no UI
demo
Events
Event AggregationEventAggregator
Service
OrderReceived
OrderManager
OrderListPresenter
Subscreve
OrderModule
OrderService
Publica Recebe
Event Aggregation – O evento...
public class OrderReceivedEvent : CompositeEvent<Order>> {}
Separa publisher e subscriber
Event Aggregation – Subscrição...
public class SomePresenter { public OrderListPresenter(IEventAggregator eventAggregator) { //subscribing to the event eventAggregator.GetEvent<OrderReceivedEvent>(). Subscribe(OnOrderReceived, ThreadOption.UIThread); }
private void OnOrderReceived(Order order) { ... }}
Contentor de eventos
Obter o evento
Subscrever o eventoReferenciar o
thread correcto
Event Aggregation – Subscrição... (2)public class SomePresenter { public OrderListPresenter(IEventAggregator eventAggregator) { // Subscrever evento eventAggregator.GetEvent<OrderReceivedEvent>(). Subscribe(OnOrderReceived, ThreadOption.UIThread, false, o=>o.Priority == Priority.High);
); }
private void OnOrderReceived(Order order) { ... }}
Manter subscriber activo
Predicado de filtragem de eventos
Event Aggregation - Publicar
public class OrderService : IOrderService { public OrderService(IEventAggregator eventAggregator) {...}
private void OrderReceived(Order) { // Publicar EventAggregator.GetEvent<OrderReceivedEvent>(). Publish(Order); }} Publicar o
evento
Publicar e subscrever eventos
demo
Patterns de Apresentação
Patterns de Apresentação• Prism 1.0
– Supervising Controller– Presentation Model
• Prism 2.0– Mais e melhores guias de Patterns– “Model-View-ViewModel”– Model Presentation State (Não estado de UI)– Thin Views – Data Templates– ViewModel Commands– ViewModel Attached Property
PresentationModel
Model
View
Onde encontrar?
• www.microsoft.com/compositewpf• www.codeplex.com/compositewpf
Deixem-se envolver...
• www.codeplex.com/compositewpfcontrib
Patrocinadores
Q&A
Software em versão completa para avaliaçãoSuporte técnico 24x7 para incidentesAcesso antecipado às versões betaMicrosoft OfficeSoftware Assuranceformação gratuita ….e muito mais.
www.microsoft .com/portuga l /msdn/subscr icoes
Subscrições
MSDN
www.microsof t . com/ learn ing /mcp/off ers /secondshot
Certificações Microsoft
MSDN Flash
www.microsoft .com/portuga l /msdn/msdnfl ash
Subscreva a MSDN Flash
Convide Amigos a seguirem o
seu exemplo…
… e ganhe livros!!
www.microsoft .com/portuga l /msdn/webcasts4share
Participe nos próximos ciclos
Traga Amigos a assistir e …
…ganhe uma Xbox, trolleys e livros
Webca
sts
[BI] Resort
GASP
GetCertified
GetVirtual
Mundo Móvel
PocketPT
PontoNetPT
UC’ed
ScrumPT
ZoomIn
Espaço COMUNIDADES
Um ponto de encontro
especial !!!
QuestionárioA sua opinião é importante!Complete o questionário de avaliação e devolva-o no balcão da recepção.
Instituto Superior TécnicoCampus do Taguspark