Composite Applicatin Guidance Para Windows Presentation Foundation Vasco Oliveira Team Leader,...

Preview:

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