Composite Applicatin Guidance Para Windows Presentation Foundation Vasco Oliveira Team Leader,...
Transcript of Composite Applicatin Guidance Para Windows Presentation Foundation Vasco Oliveira Team Leader,...
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