Rozszerzanie biblioteki Prism Marcin Przyby Biblioteka PRISM Prism

Rozszerzanie biblioteki Prism Marcin Przybył

Biblioteka PRISM Prism Biblioteka może służyć jako podstawa dla aplikacji klienckich WPF. Prism Biblioteka została zaprojektowana tak, żeby istotne elementy mogły być dostosowane lub zastąpione, aby pasowały do konkretnego scenariusza. Można modyfikować kod źródłowy dla istniejącej biblioteki, dodając nowe funkcje. Większość technik opierają się jednak na wymianie lub modyfikacji konfiguracji domyślnej biblioteki Prism podczas sekwencji ładowania początkowego po uruchomieniu aplikacji.

Punkty rozszerzeń Aby tego dokonać, należy użyć punktów rozszerzalności, takich jak publicznych klas bazowych lub interfejsów. Programiści mogą rozszerzać klasy bazowe lub zaimplementować interfejsy, aby następnie dodać swoje rozszerzenia do biblioteki. Przy rozważaniu zbioru puntów rozszerzeń należy rozważyć wpływ na użyteczność. Duża liczba punktów rozszerzeń może niepotrzebnie skomplikować bibliotekę i będzie ona trudna w obsłudze oraz konfiguracji.

Co z modyfikacją kodu? Programista powinien: ● ● Przestrzegać zasad projektowania obiektowego Stosować odpowiednie wzorce projektowe. Efektywne wykorzystanie zasobów. Stosować się do zasad bezpieczeństwa (na przykład, brak zaufania do wprowadzania danych przez użytkownika i zasady najmniejszych uprawnień).

Wskazówki Podczas modyfikowania kodu źródłowego, wykonaj poniższe wskazówki: ● ● ● Upewnij się, że wiesz, jak biblioteka działa czytając tematy, które opisują jej konstrukcję. Rozważ zmianę nazw biblioteki jeśli znacząco zmieniasz kod lub jeśli chcesz korzystać z dostosowaną wersją biblioteki wraz z oryginalną wersją. Zastanów się nad stworzeniem podzespołów wykorzystujących puntów rozszerzeń biblioteki PRISM przed modyfikacją kodu źródłowego. Używaj silnego nazewnictwa. Silna nazwa pozwala identyfikować podzespół i jego wersję oraz pozwala sprawdzać integralność. Musisz wygenerować własną pary kluczy do podpisania zmodyfikowanej wersji bloku aplikacji. Alternatywnie, możesz nie podpisać wersję niestandardową. Jest to określane jako słabe nazewnictwo. (http: //msdn 2. microsoft. com/enus/library/wd 40 t 7 ad(vs. 71). aspx)

Bootstrapper pełni rolę kleju w naszej aplikacji. Odpowiada za inicjalizację głównego okna, rejestrację modułów, inicjalizację kontenera DI.

Usługi IModule. Manager - zwraca interfejs wykorzystywany do inicjalizacji i zwracania modułów IModule. Catalog - metadane o modułach w aplikacji IModule. Initializer - inicjuje moduły IRegion. Manager - rejestruje regiony, wykorzystywane przy wizualnej reprezentacji naszej aplikacji IEvent. Aggregator - reprezentuje kolekcję zdarzeń które są luźno powiązane pomiędzy subskrybującymi i oferującymi usługi. ILogger. Facade - mechanizm logowania zdarzeń występujących w naszej aplikacji IService. Locator - pozwala na dostanie się do kontenera tworzonego w Prism.

Użycie Unity // Przy użyciu Unity public class Replacement. Event. Aggregator: IEvent. Aggregator { //. . . } // Bootstraper protected override void Configure. Container() { this. Register. Type. If. Missing(typeof(IEvent. Aggregator), typeof(Replacement. Event. Aggregator), true); base. Configure. Container(); }

Okrojony Bootstraper // when using Unity. Bootstrapper protected override void Configure. Container() { this. Container. Add. New. Extension<Unity. Bootstrapper. Extension>(); Container. Register. Instance<ILogger. Facade>(Logger); this. Container. Register. Instance(this. Module. Catalog); Register. Type. If. Missing(typeof(IService. Locator), typeof(Unity. Service. Locator. Adapter), true); } protected override Region. Adapter. Mappings Configure. Region. Adapter. Mappings() { return null; } protected override IRegion. Behavior. Factory Configure. Default. Region. Behaviors() { return null; }

Zmiana DI Container Service Locator Bootstraper

Logger // Logger using Microsoft. Practices. Prism. Logging; . . . public class Custom. Logger : ILogger. Facade { public void Log(string message, Category category, Priority priority) { string message. To. Log = String. Format(System. Globalization. Culture. Info. Invariant. Culture, "{1}: {2}. Priority: {3}. Timestamp: {0: u}. ", Date. Time. Now, category. To. String(). To. Upper. Invariant(), message, priority. To. String()); My. Other. Logging. Framework. Log(message. To. Log); } }

Logger // Bootstrapper using Microsoft. Practices. Prism. Logging; . . . public class Application. Bootstrapper : Unity. Bootstrapper {. . . protected override ILogger. Facade Create. Logger() { return new Custom. Logger(); } }

Moduł public class First. Module: IModule { public void Initialize() { throw new Not. Implemented. Exception(); } } //1 region. View. Registry. Register. View. With. Region("Main. Region", typeof(Views. First. Module. View)); //2 IRegion. Manager. Regions[stirng region. Name]. Add(view);

Moduły i katalog modułów class Prism. Boot. Strapper : Unity. Bootstrapper { protected override System. Windows. Dependency. Object Create. Shell() { return new Shell(); } protected override void Initialize. Shell() { Application. Current. Main. Window = (Window)Shell; Application. Current. Main. Window. Show(); } protected override IModule. Catalog Create. Module. Catalog() { return new Directory. Module. Catalog() { Module. Path = @"Modules" }; } }

protected override Microsoft. Practices. Prism. Modularity. IModule. Catalog Create. Module. Catalog() { Configuration. Module. Catalog catalog = new Configuration. Module. Catalog(); catalog. Store = new My. Module. Catalog. Store(); return catalog; } public class My. Module. Catalog. Store : IConfiguration. Store { public Modules. Configuration. Section Retrieve. Module. Configuration. Section() { Exe. Configuration. File. Map file. Map = new Exe. Configuration. File. Map() { Exe. Config. Filename = "My. Module. Catalog. config" }; Configuration configuration = Configuration. Manager. Open. Mapped. Exe. Configuration(file. Map, Configuration. User. Level. None); return configuration. Get. Section("modules") as Modules. Configuration. Section; } }

Adaptery Regionu Content. Control. Region. Adapter – dla kontrolek System. Windows. Controls. Content. Control i pochodnych Selector. Region. Adapter - dla pochodnych klas System. Windows. Controls. Primitives. (np. System. Windows. Controls. Tab. Control control). Items. Control. Region. Adapter – dla kontrolek typu System. Windows. Controls. Items. Control i pochodnych

<Window x: Class="Wpf. Application 1. Shell" xmlns="http: //schemas. microsoft. com/winfx/2006/xaml/presentation" xmlns: x="http: //schemas. microsoft. com/winfx/2006/xaml" xmlns: prism="clr-namespace: Microsoft. Practices. Prism. Regions; assembly=Microsoft. Practices. Prism" Title="Shell" Height="300" Width="300"> <Grid> <Stack. Panel Orientation="Vertical"> <Stack. Panel Orientation="Horizontal" prism: Region. Manager. Region. Name="Navigation. Region" /> <Content. Control prism: Region. Manager. Region. Name="Content. Region" /> </Stack. Panel> </Grid> </Window>

public class Stack. Panel. Region. Adapter : Region. Adapter. Base<Stack. Panel> { protected override void Adapt(IRegion region, Stack. Panel region. Target) { throw new Not. Implemented. Exception(); } protected override IRegion Create. Region() { throw new Not. Implemented. Exception(); } }

protected override IRegion Create. Region() { return new All. Active. Region(); }

protected override void Adapt(IRegion region, Stack. Panel region. Target){ region. Views. Collection. Changed += (s, e) =>{ if (e. Action == Notify. Collection. Changed. Action. Add){ foreach (Framework. Element item in e. New. Items) { region. Target. Children. Add(item); } } else if (e. Action ==Notify. Collection. Changed. Action. Remove){ foreach (Framework. Element item in e. New. Items) { if (region. Target. Children. Contains(item)){ region. Target. Children. Remove(item); } }; }

public Stack. Panel. Region. Adapter(IRegion. Behavior. Factory region. Behavior. Factory) : base(region. Behavior. Factory) { }

protected override Region. Adapter. Mappings Configure. Region. Adapter. Mappings() { var mappings = new Region. Adapter. Mappings(); mappings. Register. Mapping(typeof(Stack. Panel), Container. Resolve<Stack. Panel. Region. Adapter>()); return mappings; }

Zachowania Regionów protected override IRegion. Behavior. Factory Configure. Default. Region. Behaviors() { IRegion. Behavior. Factory factory = base. Configure. Default. Region. Behaviors(); factory. Add. If. Missing("My. Behavior", typeof(My. Custom. Behavior)); } http: //southworks. com/blog/2009/12/ 23/memory-leak-removing-view-withchild-regions-in-prism-v 2/

Nawigacja protected override string Get. Contract. From. Navigation. Context(Navigation. Context navigation. Context) { string contract = base. Get. Contract. From. Navigation. Context(navigation. Context); if (contract. Equals("Home", String. Comparison. Ordinal. Ignore. Case)) { return typeof(Home. View). Name; } if (contract. Equals("About", String. Comparison. Ordinal. Ignore. Case)) { return typeof(About. View). Name; } return contract; }
- Slides: 24