BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











[Porada] Katalog modułów Prism obsługujący podfoldery

25-02-2014 06:00 | Paweł Żochowski
thumb
Prism posiada różnorakie sposoby ładowania modułów za pomocą tak zwanych katalogów modułów. Jest także możliwość ładowania modułów wcześniej zbudowanych jako pliki .dll z danej ścieżki. Posiada on jednak jedną wade - wczytuje tylko te z danego folderu. W tym artykule postaram się przybliżyć prosty sposób na rozwinięcie katalogu modułów w taki sposób, aby obsługiwał także podfoldery.

Wyobraźmy sobie nasz standardowy plik Bootstrapper.cs. Zwykle znajdziemy tam taką konstrukcję odpowiedzialną za ładowanie modułów:

       protected override IModuleCatalog CreateModuleCatalog()

       {

           var moduleCatalog = newModuleCatalog();

 

           moduleCatalog.AddModule(typeof(Module1));

           moduleCatalog.AddModule(typeof(Module2));

           moduleCatalog.AddModule(typeof(Module3));

 

           return moduleCatalog;

       }

Jak wiemy, pozwala to załadować tylko moduły, do których klas aktualnie mamy dostęp. Jeżeli jednak chcielibyśmy załadować moduły, które posiadamy wcześniej przygotowane jako pliki .dll (np. przez innych dostawców albo jako pluginy do naszej aplikacji) musimy skorzystać z dostępnej w bibliotece Microsoft.Practices.Prism.Modularity klasy DirectoryModuleCatalog. Należy tylko podać ścieżkę, gdzie nasze pliki .dll będą się znajdować:

       protected override IModuleCatalog CreateModuleCatalog()

       {

           var moduleCatalog = newDirectoryModuleCatalog

           {

               ModulePath = @"C:\Program Files\OurApp\Plugins"

           };

 

           return moduleCatalog;

       }

DirectoryModuleCatalog nie obsługuje niestety czytania modułów z podfolderów. Jak więc to zrobić? Nic prostszego (szczególnie z tym poradnikiem)!

Na początek stwórzmy klasę, która będzie reprezentowała nasz własny katalog modułów, ale będzie dziedziczyła po już istniejącym katalogu DirectoryModuleCatalog:

   public class MyModuleCatalog : DirectoryModuleCatalog

   {

      

   }

Od teraz będziemy korzystać właśnie z tej klasy. DirectoryModuleCatalog zawiera metodę InnerLoad(), która zajmuje się ładowaniem modułów. Musimy opracować jej część we własny sposób:

   public class MyModuleCatalog : DirectoryModuleCatalog

   {

       protected override void InnerLoad()

       {

           //Wykonujemy logikę bazowej metody InnerLoad

           base.InnerLoad();

 

           //Wykonujemy InnerLoad dla wszystkich podfolderów

           var folders = Directory.GetDirectories(ModulePath, "*", SearchOption.AllDirectories);

 

           foreach (var folder in folders)

           {

               ModulePath = folder;

               InnerLoad();

           }

       }

   }

Jak widać, wykorzystując rekurencję i metodę Directory.GetDirectories() dla podanej wcześniej ścieżki katalogów z modułami – zmieniam tą ścieżkę na każdy z podfolderów, a następnie ładuję z nich moduły.

Oczywiście możecie pokombinować i kontrolować na przykład poziom przechodzenia do kolejnych podfolderów, ale to pozostawię już Wam!

Źródło: Własne

Podobne artykuły

Komentarze 0

pkt.

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.