Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałRadomiła Rogulski Został zmieniony 10 lat temu
1
Rozszerzalna architektura
2
Rozszerzalna architektura - Zagadnienia: Interfejsy Odkrywanie Komunikacja
3
Rozszerzalna architektura MAF (System.AddIn-s).NET v.3.5. Izolacja (odddzielna AppDomain), stosunkowo ciężki MEF.Net 4.0 Discovery, obsługa metadanych, opóźniona kreacja IOC/DI Containers Decoupling, testowanie, scentralizowana rejestracja,
4
MAF – System-addin Odkrywanie (odkrywanie pluginow w czasie dzialania) Aktywacja Wersjonowanie Izolacja (oddzielny AppDomain/proces) Zarządzanie czasem życia Piaskownica – (możliwośc okreslenia zestawu uprawnień) wyładowywanie – (w rune-time)
5
MAF – System-addin System.AddIn System.AddIn.Contract Klasy z System.AddIn.Hosting: AddInController, AddInEnvironment, AddInProcess,, AddInStore, AddInToken, InvalidPipelineStoreException, AddInSegmentDirectoryNotFoundException Źródła: MSDN http://clraddins.codeplex.com/
6
MAF – architektura
7
MAF – kalkulator WPF Plugin: Visual Studio Pipeline Builder http://clraddins.codeplex.com/releases/view/9454
8
MAF – WPF calculator [System.AddIn.Pipeline.AddInContract] public interface ICalculatorContract : IContract { IListContract GetOperations(); double Operate(IOperationContract op, double[] operands); string GetName(); }
9
MAF – System-addin AddInStore.Rebuild(path); IList tokens = AddInStore.FindAddIns(typeof(Calculator), path); foreach (AddInToken token in tokens) { addins.Add(token.Activate ( AddInSecurityLevel.Internet) ); } addins[i]. Operate(...);
10
MAF – pipeline builder - nazwy [assembly:PipelineHints.SegmentAssemblyName(PipelineHint s.PipelineSegment.HostView, "MyApplica PipelineHints.PipelineSegment.HostView, PipelineHints.PipelineSegment.AddInView, PipelineHints.PipelineSegment.HostSideAdapter, PipelineHints.PipelineSegment.AddInSideAdapter
11
MEF DI Atrybuty Discovery Brak izolacji
12
MEF - koncepcja
13
MEF - architektura
14
MEF – Podstawowe pojęcia Export Export dla typu/funkcji/pól Wymuszony typ: Export(typeof(Ixxx)) Nazwany kontrakt: Export("name",typeof(Ixxx)) Export nie jest dziedziczony – można użyć InheritedExport Import Dla typu określonego w kodzie Import określonego typu/kontraktu
15
MEF – Zalecane praktyki Imort/Eksport Interfejsów zamiast konkretnych typow Stałe jako nazwy kontraktow stale/i kontrakty w oddzielnych assembly
16
MEF – rozwiązywanie zależności Pola imporowane są inicjowane po konstruktorze stąd nie mozna ich uzyc w konstruktorze Rozwiazanie: ImportingConstructor na konstruktorze (ciagle potrzbne import na parametrach) Przy konstruktorze - eksportowane klasy/interfejsy musza byc publiczne
17
MEF – export/import [Export] public class SomeComposablePart {... } public class MessageSender { [Export(typeof(Action ))] public void Send(string message) {Console.WriteLine(message); } } public class Configuration { [Export("Timeout")] public int Timeout { get { return int.Parse( ConfigurationManager.AppSettings["Timeout"]); } } }
18
MEF – export/import class Program { [Import] public IMessageSender MessageSender { get; set; } } class Program { [ImportingConstructor] public Program(IMessageSender messageSender) {... } } class Program { [Import] private IMessageSender _messageSender; }
19
MEF – tworzenie obiektu var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); container.ComposeParts(this);
20
MEF – liczebność (cardinality) 1 – domyślne podejście 0..1 [Import(AllowDefault=True)], 0..* [ImportMany] -> zwraca IEnumerable
21
MEF – nieobligatoryjny import [Export] public class OrderController { private ILogger _logger; [ImportingConstructor] public OrderController([Import(AllowDefault=true)] ILogger logger) { if(logger == null) logger = new DefaultLogger(); _logger = logger; } }
22
MEF – import kolekcji public class Notifier { [ImportMany(AllowRecomposition=true)] public IEnumerable Senders {get; set;} public void Notify(string message) { foreach(IMessageSender sender in Senders) { sender.Send(message); } } }
23
MEF – opóźniony import Pozwala nie tworzyc nieużywanych (jeszcze?) obiektów GetGetExport<>(), GetExports(), GetExports<>() Zwracają: Lazy Value IsValueCreated Meadata
24
MEF – opóźniony import [Export] public class HttpServerHealthMonitor { [Import] public Lazy Sender { get; set; }
25
MEF – metadane Mogą zostać odczytane I przetworzone przed utworzeniem obiektu Metadane -> ExportMetada Dictionary Silnie typowane, oparte o interfejsy Metadane można wykorzystać np do wyświelenia informacji o nieutworzonych obiektach Podjęcia decyzji czy tworzyć dane obiekty
26
MEF – filtrowanie var catalog = new AssemblyCatalog(typeof(Program).Assembly); var parent = new CompositionContainer(catalog); var filteredCat = new FilteredCatalog(catalog, def => def.Metadata.ContainsKey("scope") && def.Metadata["scope"].ToString() == "webrequest"); var perRequest = new CompositionContainer( filteredCat, parent); var controller = perRequest.GetExportedObject (); perRequest.Dispose();
27
MEF – rekompozycja Możliwa jest zmiana skomponowanych obiektów w rune-time. Nie dziala to przy wstrzykiwaniu przez konstruktor Wymaga zezwolenia Import(RecompositionAllowed=true) Można miejscowo zablokowac przez SatisfyImportOnce...
28
MEF – czas życia Shared = singleton Release – uwalnianie elementu var batchProcessorExport = container.GetExport (); var batchProcessor = batchProcessorExport.Value; batchProcessor.Process(); container.ReleaseExport(batchProcessorExport);
29
MEF – kompozycja kontenerów
30
MEF – diagnostyka
31
Command window: The mefx Command-Line Analysis Tool
32
MEF – Typowe problemy Liczebność skojarzeń (cardinality) Katalogi, maska, ignorowanie części Niedopasowanie kontraktów – zbyt ogólne/szegółowe Brak eksportów Warto wlaczyc tracing w konf. (std..NET)
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.