Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Rozszerzalna architektura

Podobne prezentacje


Prezentacja na temat: "Rozszerzalna architektura"— Zapis prezentacji:

1 Rozszerzalna architektura

2 Rozszerzalna architektura -
Zagadnienia: Interfejsy Odkrywanie Komunikacja

3 Rozszerzalna architektura
Refleksja... IOC/DI Containers Decoupling, testowanie, scentralizowana rejestracja, 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

4 MAF – System-addin Aktywacja/wyładowywanie – (w rune-time)
Wersjonowanie Izolacja (oddzielny AppDomain/proces) Zarządzanie czasem życia Piaskownica – (możliwośc okreslenia zestawu uprawnień) Odkrywanie (odkrywanie pluginow w czasie dzialania)

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

6 MAF – architektura

7 MAF – kontrakt [System.AddIn.Pipeline.AddInContract]
public interface ICalculatorContract : IContract { IListContract<IOperationContract> GetOperations(); double Operate(IOperationContract op, double[] operands); string GetName(); }

8 MAF – instancjonowanie i użycie
AddInStore.Rebuild(path); IList<AddInToken> tokens = AddInStore.FindAddIns(typeof(Calculator), path); foreach (AddInToken token in tokens) { addins.Add(token.Activate<IAddIn>( AddInSecurityLevel.Internet) ); } addins[i].Operate(...);

9 MAF – pipeline builder - nazwy
[assembly:PipelineHints.SegmentAssemblyName(PipelineHints.PipelineSegment.HostView, "MyApplica PipelineHints.PipelineSegment.HostView, PipelineHints.PipelineSegment.AddInView, PipelineHints.PipelineSegment.HostSideAdapter, PipelineHints.PipelineSegment.AddInSideAdapter

10 MAF – kalkulator WPF Plugin: Visual Studio Pipeline Builder

11 MEF Discovery Atrybuty DI 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 importowane 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<string>))] public void Send(string message) { … } } public class Configuration { [Export("Timeout")] public int Timeout { get { return …; } } }

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<interface>

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<IMessageSender> 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<T> Lazy<T,Metadata> Value IsValueCreated Meadata

24 MEF – opóźniony import [Export] public class HttpServerHealthMonitor { [Import] public Lazy<IMessageSender> Sender { get; set; } }

25 MEF – metadane Dictionary<String,obiect>
Mogą zostać odczytane I przetworzone przed utworzeniem obiektu Metadane -> ExportMetada Dictionary<String,obiect> 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<HomeController>(); 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<IBatchProcessor>(); var batchProcessor = batchProcessorExport.Value; batchProcessor.Process(); container.ReleaseExport(batchProcessorExport);

29 MEF – kompozycja kontenerów

30 MEF – diagnostyka

31 MEF – diagnostyka 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 włączyć tracing w konf. (std. .NET)


Pobierz ppt "Rozszerzalna architektura"

Podobne prezentacje


Reklamy Google