.NET 3.0 i 3.5
Transkrypt
.NET 3.0 i 3.5
.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. WSSecurity 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: − − − Grafika 3D − Proste kształty Własne kształty Maski 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