520 likes | 602 Views
Composite Applicatin Guidance. P ara 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
E N D
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çadoemJulho de 2008 • Prism 2.0 – WPF e Silverlight • Q1 2009 – (Actualmentena 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
In the box: Reference Implementation • Abrir o Visual Studio • File-> Open ->CWPF\Source\StockTraderRI\StockTraderRI.sln
Composite Application Guidance: Conceitos Bootstrapper Bootstrapper DI/IoC Containers DI/IoC Containers Módulos Módulos Compor UI - Regiões Compor UI - Regiões Shell e View Shell e View Eventos e Comandos Eventos e Comandos
Bootstrapper • Responsável pela inicialização • Fases: • Configuração • Regiões • Shell • Módulo
Container • CAL suporta vários DI Containers • IContainerFacade • Implementação Unity • UnityContainerAdapter
Módulos – O que são? • Assemblies daaplicação • Colecção de componentesrelacionados • Serviços, UI, Acesso a dados • Unidade de desenvolvimento • Desenvolvimentoindependente • Testes independentes
Módulos - Carregamento • ModuleLoader - Catalogo de Modulos • Loading estático, porconfiguração, dinâmico • Inicializaçãoem 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 IModuleEnumeratorGetModuleEnumerator() { return new StaticModuleEnumerator() .AddModule(typeof(SomeModule)) .AddModule(typeof(AnotherModule), "SomeModule") .AddModule(typeof(YetAnotherModule), "AnotherModule","SomeModule"); } } LocalizaMódulos Retornamódulos Referenciadosestáticamente Module Type Dependências
Módulos - Inicialização public class SomeModule : IModule public SomeModule(SomeDependencymyDependency) {...} public void Initialize() { RegisterViewsAndServices(); //Show views here; } } Dependênciainjectada Lógica de Inicialização
demo Dividirumaaplicaçãoemmódulosporconfiguração
Módulos –Loading Dinâmico public class MyBootstrapper : UnityBootstrapper { ... protected override IModuleEnumeratorGetModuleEnumerator() { • return new DirectoryLookupModuleEnumerator(@".\Modules"); } } “Hot folder”
demo Loadingdinâmico de módulos
Regiões • Shell – Janela “Host” daaplicação • Regions – Áreasdefinidasparainjecção de Views • Views – UI e lógica de apresentação IPortfolioPresentationModelpresentationModel = …; IRegionmainRegion =regionManager.Regions[ "MainRegion"]; mainRegion.Add( presentationModel.View ); <ItemsControl RegionManager.RegionName= "MainRegion"> Region <ContentControlRegionManager.RegionName= “DetailsRegion” /> Region Region
Regiões – Registo Maior parte das vezes, Regions sãoItemsControls MyShell.xaml <TabControl x:Name="OrderTab" ItemContainerStyle="..." CAL:RegionManager.RegionName="OrderRegion" /> RegionName attached property
Regiões – Exibição RegionManager é necessário public class MyModule : IModule { public void Initialize (IRegionManager manager) { RegisterViewsAndServices(); IRegionorderRegion = manager.GetRegion("OrderRegion"); varmyOrderView = new OrderView(myOrder); orderRegion.Add(myOrderView); } } ObtençãodaRegião Inicializaçãoda View View é exibida
Regiões – Templating ("WPF way") public class MyModule : IModule { public void Initialize(IRegionManager manager) { RegisterViewsAndServices(); IRegionorderRegion = manager.GetRegion("OrderRegion"); orderRegion.Add(myOrder); } } Objecto é adicionadodirectamente
demo Compondo o UI com Regions e Views
Commands Composite Command Submit All OrderDetails OrderDetails OrderDetails Submit Submit Submit Delegate Commands
Commands - Binding <StackPanel Orientation="Horizontal"> <Button Name="SubmitAllToolbarButton" Command="{x:Static inf:Commands.SubmitOrdersCommand}"> Submit All </Button> </StackPanel Atribuir Command
CompositeCommands - Registar public class OrderDetailsPresenter : IOrderDetailsPresenter { private ICommandorderSubmitCommand; public OrderDetailsPresenter(...) { orderSubmitCommand = … // Register the command Commands.SubmitOrdersCommand.RegisterCommand(orderSubmitCommand); } } Registar command comofilho
Commands - Handling public class OrderDetailsPresenter : IOrderDetailsPresenter { private ICommandorderSubmitCommand; public OrderDetailsPresenter (IOrderDetailsView view, { orderSubmitCommand = new DelegateCommand(Submit, CanSubmit); // Register the command Commands.SubmitOrdersCommand.RegisterCommand(orderSubmitCommand); } public void Submit(object params) {...} public boolCanSubmit(object params) {...} } Tratar Execute e CanExecute
demo Usando Commands paralidar com eventos no UI
Event Aggregation EventAggregator Service OrderReceived Recebe Publica Subscreve OrderModule OrderManager OrderService OrderListPresenter
Event Aggregation – O evento... public class OrderReceivedEvent : CompositeEvent<Order>> {} Separapublisher e subscriber
Event Aggregation – Subscrição... public class SomePresenter { public OrderListPresenter(IEventAggregatoreventAggregator) { //subscribing to the event eventAggregator.GetEvent<OrderReceivedEvent>(). Subscribe(OnOrderReceived, ThreadOption.UIThread); } private void OnOrderReceived(Order order) { ... } } Contentor de eventos Obter o evento Referenciar o thread correcto Subscrever o evento
Event Aggregation – Subscrição... (2) public class SomePresenter { public OrderListPresenter(IEventAggregatoreventAggregator) { // Subscreverevento 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(IEventAggregatoreventAggregator) {...} private void OrderReceived(Order) { // Publicar EventAggregator.GetEvent<OrderReceivedEvent>(). Publish(Order); } } Publicar o evento
demo Publicar e subscrevereventos
Patterns de Apresentação • Prism 1.0 • Supervising Controller • Presentation Model • Prism 2.0 • Mais e melhoresguias de Patterns • “Model-View-ViewModel” • Model Presentation State (Nãoestado de UI) • Thin Views – Data Templates • ViewModel Commands • ViewModel Attached Property View Presenter Model View Presentation Model Model
Onde encontrar? • www.microsoft.com/compositewpf • www.codeplex.com/compositewpf
Deixem-se envolver... • www.codeplex.com/compositewpfcontrib
SubscriçõesMSDN • Software em versão completa para avaliação • Suporte técnico 24x7 para incidentes • Acesso antecipado às versões beta • Microsoft Office • Software Assurance • formação gratuita ….e muito mais. www.microsoft.com/portugal/msdn/subscricoes
Certificações Microsoft www.microsoft.com/learning/mcp/offers/secondshot
Subscreva a MSDN Flash • Convide Amigos a seguirem o seu exemplo… • … e ganhe livros!! MSDN Flash www.microsoft.com/portugal/msdn/msdnflash
Participe nos próximos ciclos • Traga Amigos a assistir e … • …ganhe uma Xbox, trolleys e livros Webcasts www.microsoft.com/portugal/msdn/webcasts4share
[BI] Resort • GASP • GetCertified GetVirtual Mundo Móvel PocketPT PontoNetPT • UC’ed ScrumPT ZoomIn Espaço COMUNIDADES Um ponto de encontro especial !!!