Jak stworzyć program z pluginami w C#

Od początku pracy nad DesktopInfo wiadome było, że będzie potrzebny mechanizm do ładowania pluginów, dodatkowych modułów, które rozszerzą możliwości aplikacji bez potrzeby jej rekompilacji.

Pierwszy pomysł jaki przechodzi do głowy to refleksja. Jednak jakiś czas temu postała biblioteka MEF, która została włączona do .NET Framework 4.0 Ponieważ aplikacja DesktopInfo wykorzystuje właśnie tą wersję .NET, to dlaczego nie wykorzystać nowej funkcjonalności.

Zatem zobaczmy krok po kroku co jest potrzebne aby wykorzystać dobroci MEF-a

Dodajemy referencję do biblioteki

System.ComponentModel.Composition

oraz

[csharp]

using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;

[/csharp]

Obiekt typu CompositionContainer będzie odpowiedzialny za załadowanie naszych bibliotek.

[csharp]

CompositionContainer pluginsLoader;

[/csharp]


A kawałek kodu odpowiedzialny za ich załadowanie (pluginów) wygląda tak:

[csharp]

private void LoadPlugins()
{
DirectoryCatalog appDir = new DirectoryCatalog(’ściezka do katalogu z pluginami’);
pluginsLoader = new CompositionContainer(appDir);
pluginsLoader.ComposeParts(this);
}

[/csharp]”That’s fucking it” says the geezer.

„That’s fucking what” says Rorry. (Lock stock and two smoking barrels).

No właśnie czegoś brakuje. LoadPlugins powoduje, że MEF przeglądnie wszystkie pliki dll w katalogu aplikacji. ComposeParts powoduje, że uruchamiamy cały mechanizm. Tylko gdzie te wszystkie pluginy będą załadowane? Potrzebujmy jakiś kontener, który będzie je przechowywał.

[csharp]

[ImportMany(typeof(IDesktopInfoPlugin))]
private IList<IDesktopInfoPlugin> plugins { get; set; }

[/csharp]Kontener jest oznaczony atrybutem ImportMany, który mówi MEF-owi gdzie ma wczytać obiekty oraz podaje interfejs, który obiekty muszą spełniać aby zostać zaczytane. Proste i eleganckie. Po wykonaniu ComposeParts w kontenerze plugins otrzymamy listę obiektów implementujących IDesktopInfoPlugin oraz znajdujących się w bibliotekach, które MEF znalazł w „ścieżce do katalogu z plikami”.

.NET ciągle mnie zadziwia dzięki takim właśnie rodzynkom.