.NET 3.0 i 3.5
.NET 3.0 Składa się z:.net Framework Microsoft Windows Communication Foundation Microsoft Windows Presentation Foundation Microsoft Windows Workflow Foundation.NET Framework jak w wersji 2.0
WCF Zarządzane podejście do systemów rozproszonych Model programowania zorientowany na serwisy (service model) Mapowanie pomiędzy serwisami a elementami CLR mapowanie wiadomości do implementacji w C# lub VB Wsparcie dla wielu rodzajów aplikacji rozproszonych, architektura warstwowa Kanały umożliwiające asynchroniczne przesyłanie wiadomości, bez wsparcia dla typów Protokoły wykorzystujące ww. kanały
Przykład użycia WCF http://msdn2.microsoft.com/en-us/library/ms731082(vs.85).aspx
Założenia System (serwer) musi być dostępny zarówno wewnątrz organizacji, jak i na zewnątrz, przy użyciu różnych klientów: Aplikacja kliencka wewnątrz organizacji (call center), używająca.net i WCF Aplikacja kliencka J2EE, konieczna z powodu współpracy z inną firmą i mająca dostęp do nowego systemu. Aplikacje klienckie z dostępem przez Internet zróżnicowane pod względem platform
Bez WCF Konieczność wykorzystania następujących technologii: ASP.NET Web services (ASMX) do komunikacji z J2EE i klientami przez Internet.NET Framework remoting do komunikacji z call center, ponieważ zarówno klient, jak i serwer wykorzystują.net. Umożliwia przezroczystą komunikację aplikacji.net Enterprise Services definiują rozproszone transakcje i czas życia obiektów Web Services Enhancements (WSE) dla zapewnienia lepszego bezpieczeństwa ASMX Microsoft Message Queuing (MSMQ) wsparcie dla komunikacji z klientami Windows
Z wykorzystaniem WCF WCF zapewnia następującą funkcjonalność: Ponieważ może komunikować się z wykorzystaniem web services (przez SOAP) współpracę z J2EE Komunikację z wykorzystaniem web services przez inne protokoły (np. RSS) Wysoką wydajność w porównaniu z innymi rozproszonymi platformami firmy Microsoft Szybszą niż tekstowa komunikację binarną z innymi aplikacjami WCF (struktura danych jest nadal zgodna z SOAP) Zarządzanie czasem życia obiektów i rozproszonymi transakcjami Bezpieczeństwo
Architektura WCF http://msdn2.microsoft.com/en-us/library/ms733128(vs.85).aspx
Kontrakty Określa jak komunikować się z serwisem: Data parametry wiadomości (przy pomocy XSD) Message fragmenty wiadomości (przy pomocy SOAP) Service sygnatury metod (np. w C#) Policy and binding warunki komunikacji z serwisem (co najmniej transport np. HTTP, kodowanie i wymogi bezpieczeństwa)
Service runtime Zachowania dotyczące pracy serwisu, np.: Throttling ile wiadomości przetwarzać żeby nie zablokować serwisu Error co robić w przypadku błędu Instance ile egzemplarzy serwisu może działać Transaction umożliwia 'rollback' nieudanych transakcji
Messaging Składa się z kanałów. Kanał w pewien sposób przetwarza wiadomości. Zespół kanałów to stos. Wyróżnia się kanały: Transportu czytają i piszą wiadomości z/do sieci (lu innego medium komunikacyjnego). Np. HTTP, TCP, MSMQ. Mogą stosować różne rodzaje kodowania Protokołu implementują protokoły przetwarzania wiadomości, zwykle poprzez czytanie/pisanie dodatkowych nagłówków wiadomości. Np. WS- Security
Activation and hosting Serwis ostatecznie to program który musi być wykonywany. Może być: Samodzielny (exe) tzw. self-hosted Zarządzany przez zewnętrzne środowisko (np. IIS, WAS)
Przykładowe użycie WCF - serwer http://msdn2.microsoft.com/en-us/library/ms731835(vs.85).aspx Utworzyć projekt Zdefiniować kontrakt (kolekcja i struktura wiadomości wymaganych do dostępu do serwisu): Dodać odwołanie do System.ServiceModel Utworzyć odpowiednie interfejsy, zastosować atrybut ServiceContract Utworzyć metody w interfejsie, zastosować atrybut OperationContract Domyślny kontrakt wykorzystuje schemat żądanieodpowiedź. Inne schematy można wymusić poprzez własności atrybutów OperationContract i ServiceContract
Kod using System; using System.ServiceModel; namespace Microsoft.ServiceModel.Samples { // Define a service contract. [ServiceContract(Namespace = "http://microsoft.servicemodel.samples")] public interface ICalculator { [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); } }
Przykładowe użycie WCF - serwer Zaimplementować kontrakt klasę implementującą interfejs
Kod public class CalculatorService : ICalculator { public double Add(double n1, double n2) { double result = n1 + n2; Console.WriteLine("Received Add({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } public double Subtract(double n1, double n2) { double result = n1 - n2; Console.WriteLine("Received Subtract({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } public double Multiply(double n1, double n2) { double result = n1 * n2; Console.WriteLine("Received Multiply({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } } public double Divide(double n1, double n2) { double result = n1 / n2; Console.WriteLine("Received Divide({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; }
Przykładowe użycie WCF - serwer Uruchomić serwis: Utworzyć adres bazowy dla serwisu Utworzyć odpowiednie uri, np.: Uri baseaddress = new Uri("http://localhost:8000/ServiceModelSamples/Service"); Utworzyć hosta dla serwisu Utworzyć obiekt typu ServiceHost: ServiceHost servicehost = new ServiceHost(typeof(CalculatorService), baseaddress); Dodać punkt końcowy z określonym transportem servicehost.addserviceendpoint(typeof(icalculator), new WSHttpBinding(), "CalculatorService"); Umożliwić wymianę metadanych ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.httpgetenabled = true; servicehost.description.behaviors.add(smb); Otworzyć hosta serwisu
Kod class Program { static void Main(string[] args) { Uri baseaddress = new Uri("http://localhost:8000/ServiceModelSamples/Service"); ServiceHost servicehost = new ServiceHost(typeof(CalculatorService), baseaddress); try { servicehost.addserviceendpoint( typeof(icalculator), new WSHttpBinding(), "CalculatorService"); ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.httpgetenabled = true; servicehost.description.behaviors.add(smb); servicehost.open(); Console.WriteLine("The service is ready."); Console.WriteLine("Press <ENTER> to terminate service."); Console.WriteLine(); Console.ReadLine(); } } servicehost.close(); } catch (CommunicationException ce) { Console.WriteLine("An exception occured: {0}", ce.message); servicehost.abort(); }
Service strona serwisu
Przykładowe użycie WCF - klient Utworzyć projekt Dodać odwołanie do System.ServiceModel Uruchomić serwer (serwis) Uruchomić Service Model Metadata Utility Tool (SvcUtil.exe) - część Windows SDK svcutil.exe /language:cs /config:app.config http://localhost:8000/servicemodelsamples/service Dodać wygenerowany plik z kodem do projektu
Przykładowe użycie WCF - klient Skonfigurować klienta Dodać do projektu plik konfiguracyjny wygenerowany przez Svcutil <?xml version="1.0" encoding="utf-8"?> <configuration> <system.servicemodel> <bindings> <wshttpbinding> <binding name="wshttpbinding_icalculator"> </binding> </wshttpbinding> </bindings> <client> <endpoint address="http://localhost:8000/servicemodelsamples/service/calculatorservice" binding="wshttpbinding" bindingconfiguration="wshttpbinding_icalculator" contract="microsoft.servicemodel.samples.icalculator" name="wshttpbinding_icalculator"> </endpoint> </client> </system.servicemodel> </configuration>
Przykładowe użycie WCF - klient Używać klienta: Utworzyć obiekt klasy EndpointAddress EndpointAddress epaddress = new EndpointAddress ("http://localhost:8000/servicemodelsamples/service/calculatorservice"); CalculatorClient client = new CalculatorClient(new WSHttpBinding(), epaddress); Wywoływać operacje udostępniane przez serwis Zamknąć klienta
using System; using System.Collections.Generic; using System.Text; using System.ServiceModel; namespace ServiceModelSamples { Kod class Client { static void Main() { EndpointAddress epaddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/Service/CalculatorService"); CalculatorClient client = new CalculatorClient(new WSHttpBinding(), epaddress); double value1 = 100.00D; double value2 = 15.99D; double result = client.add(value1, value2); Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); value1 = 145.00D; value2 = 76.54D; result = client.subtract(value1, value2); Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result); value1 = 9.00D; value2 = 81.25D; result = client.multiply(value1, value2); Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result); value1 = 22.00D; value2 = 7.00D; result = client.divide(value1, value2); Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result); client.close(); Console.WriteLine(); Console.WriteLine("Press <ENTER> to terminate client."); Console.ReadLine(); } } }
Windows Presentation Foundation (WPF) http://msdn2.microsoft.com/en-us/library/aa970268(vs.85).aspx Umożliwia tworzenie klienckich aplikacji dla Windows Większość klas opiera się na jednej z: UIElement FrameworkElement ContentElement FrameworkContentElement Interfejs użytkownika jest zbudowany jako drzewo Zdarzenia w elementach mogą być przekazywane zgodnie ze strukturą drzewa
Windows Presentation Foundation (WPF) UI jest konstruowane przy użyciu Extensible Application Markup Language (XAML), opartego o XML: <Window Xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <Button>Hello, XAML!</Button> </Window>
Standardowe kontrolki Control klasa bazowa edycja: CheckBox, ComboBox, PasswordBox, RadioButton, RichTextBox, Slider, TextBox listy: ListBox, ListView, TreeView informacje: Label, ProgressBar, Popup, ToolTip czynności: Button, ContextMenu, Menu, Separator, StatusBar, Thumb, ToolBar wygląd: Border, BulletDecorator, Decorator, Image, Viewbox Okienka dialogowe: OpenFileDialog, PrintDialog, SaveFileDialog pojemniki: Expander, GroupBox, RepeatButton, ScrollBar, ScrollViewer, TabControl rozkład: Canvas, DockPanel, Grid, GridSplitter, Panel, StackPanel, VirtualizingStackPanel, WrapPanel. nawigacja: Frame, Hyperlink dokumenty: DocumentViewer, FlowDocumentPageViewer, FlowDocumentReader, FlowDocumentScrollViewer
Praca z danymi Możliwość powiązania różnych źródeł danych z elementami UI <Window... xmlns:src="clr-namespace:applicationnamespace">... <!-- Binding Source --> <Window.Resources> <src:person x:key="mydatasource" PersonName="Joe"/> </Window.Resources>... <!-- Binding Target --> <TextBlock Text="{Binding Source={StaticResource mydatasource}, Path=PersonName}" />... </Window>
Standaryzacja wyglądu Możliwośc definiowania wspólnego wyglądu dla grupy elementów <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Window.Resources> <SolidColorBrush x:key="defaultbackground" Color="Red" /> </Window.Resources> < StackPanel> <Button Background="{StaticResource defaultbackground}">one Button</Button> <Label Background="{StaticResource defaultbackground}">one Label</Label> </StackPanel> </Window> Możliwośc stosowania styli <Style TargetType="{x:Type Button}"> <Setter Property="Background" Value="Yellow"/> </Style>
Możliwość zmiany wyglądu kontrolki przy zachowaniu funkcjonalności Wykorzystuje control templates <Button Content="Not Pressed"> <Button.Template> <ControlTemplate TargetType="{x:Type Button}"> <Border x:name="border" CornerRadius="80" Background="LightBlue"> <ContentPresenter Name="content" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="border" Property="Background" Value="Aqua" /> <Setter TargetName="content" Property="Content" Value="Pressed" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Button.Template> </Button>
Możliwość zmiany wyglądu zawartości kontrolki Wykorzystuje data templates <DataTemplate x:key="mytasktemplate"> <Border Name="border" BorderBrush="Aqua" BorderThickness="1" Padding="5" Margin="5"> <Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <TextBlock Grid.Row="0" Grid.Column="0" Text="Task Name:"/> <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=TaskName}" /> <TextBlock Grid.Row="1" Grid.Column="0" Text="Description:"/> <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Description}"/> <TextBlock Grid.Row="2" Grid.Column="0" Text="Prioirty:"/> <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=Priority}"/> </Grid> </Border> </DataTemplate>
Rozplanowanie UI przy pomocy paneli Kontrolki: Canvas, DockPanel, Grid, StackPanel, VirtualizingStackPanel, WrapPanel <DockPanel> <DockPanel.Resources> <Style TargetType="{x:Type Border}"> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="1" /> </Style> <Style TargetType="{x:Type TextBlock}"> <Setter Property="Margin" Value="5" /> <Setter Property="FontWeight" Value="Medium" /> </Style> </DockPanel.Resources> <Border Background="SkyBlue" DockPanel.Dock="Top"> <TextBlock>Dock = "Top"</TextBlock> </Border> <Border Background="SkyBlue" DockPanel.Dock="Top"> <TextBlock>Dock = "Top"</TextBlock> </Border> <Border Background="PaleGoldenrod" DockPanel.Dock="Bottom"> <TextBlock>Dock = "Bottom"</TextBlock> </Border> <Border Background="PaleGreen" DockPanel.Dock="Left"> <TextBlock>Dock = "Left"</TextBlock> </Border> <Border Background="White"> <TextBlock>This content "Fills" the remaining, unallocated space.</textblock> </Border> </DockPanel>
Wsparcie dla multimediów Grafika 2D: Proste kształty Własne kształty Maski Grafika 3D Wykorzystanie sprzętowej akceleracji Animacja Strumienie audio Strumienie wideo
Windows Workflow Foundation (WWF) http://msdn2.microsoft.com/en-us/library/ms734631(vs.85).aspx Model, engine i narzędzia do budowy aplikacji typu workflow Workflow jest rozumiany jako zestaw jednostkowych elementów (activity) połączonych w sposób opisujący kolejność ich wykonywania i zależności między nimi Wiele egzemplarzy workflow może być wykonywanych jednocześnie Workflow może być umieszczony w każdym procesie Windows (aplikacji konsolowej, serwisie, aplikacji ASP.NET) i komunikować się z tym procesem
Czynności (activities) Czynności są dodawane programowo do workflow Czynność może zawierać pojedynczą akcję, może też zawierać zbiór innych czynności Czynności mają dwa rodzaje zachowania: W momencie projektowania jak czynność jest prezentowana podczas procesu projektowania W momencie wykonania WWF zawiera bibliotekę standardowych czynności i wsparcie dla tworzenia własnych czynności
Wsparcie dla typowych zachowań wymaganych przez workflow Compensation przywrócenie stanu sprzed wykonania czynności (potrzebne np. do obsługi wyjątków) Persistence zapisywanie workflow tak aby mógł być kontynuowany w przypadku restartu aplikacji Tracking logowanie zdarzeń w workflow, np. do bazy danych Serialization zapis i odczyt workflow i czynności
Elementy decyzyjne Decyzje dotyczące przebiegu workflow mogą być budowane w oparciu o: Warunki: czynności IfElseBranchActivity i ConditionedActivityGroup Reguły definiowane programowo lub poprzez plik XML. Reguły mogą być zmieniane podczas pracy workflow
.NET 3.5 Zmiany w stosunku do 3.0: ASP.NET: Lepsze wsparcie dla technologii AJAX, zarówno od strony serwera, jak i klienta Wsparcie dla serwisów WCF Kilka nowych kontrolek Wsparcie dla rozszerzalnych aplikacji (System.AddIn.dll)
.NET 3.5 CLR: Nowa kolekcja HashSet Wsparcie dla diagnostyki EventSchemaTraceListener Pipes anonymous i named Możliwość wpływu na działanie garbage collector Poprawa wydajności synchronizacji i wątków thread pool Nowe struktury dal czasu i daty Nowe elementy dla kryptografii Wsparcie dla sieci Peer-to-Peer Poprawa wydajności socketów
.NET 3.5 Połączenie Windows Workflow Foundation i Windows Communication Foundation Zmiany i rozszerzenia w WCF Zmiany i rozszerzenia w WPF Rozszerzenia w Windows Forms Language-Integrated Query (LINQ) możliwość formułowania zapytań w C# i VB