Blog (220)
Komentarze (4k)
Recenzje (1)

Managed Extensibility Framework — system pluginów do aplikacji .NET od Microsoftu

@djfoxerManaged Extensibility Framework — system pluginów do aplikacji .NET od Microsoftu 22.03.2017 17:42

W poprzednim wpisie pokazałem jak szybko stworzyć własne okienko w Visual Studio (timer w okienku IDE ). Dziś opiszę MEF, czyli framework do tworzenia lekkich aplikacji i pisania rozszerzeń do nich. To właśnie na nim opiera się IDE od Microsoftu.

MEF w teorii

Obecnie MEF (Managed Extensibility Framework) jest komponentem .NET 4.0. Biblioteka powstała jako odpowiedź na zapotrzebowania programistów w tworzeniu aplikacji, które mogłyby być rozszerzalne poprzez zewnętrzne pluginy (reużywalne). Jest on zbiorem wcześniejszych doświadczeń, który pozwala w prosty sposób na zaimplementowanie systemu rozszerzeń w każdej aplikacji .NET, bez tworzenia kolejnego frameworku od zera.

MEF można uznać za bibliotekę pozwalająca na Dependency Injection opartą na atrybutach. Pozwala ona na tworzenie aplikacji na zasadzie odkrywania (wyszukiwania) rozszerzeń i ładowania ich dynamicznie do programu. Takie dodatki mogą być reużywalne przez różne aplikacje. MEF umożliwia dla programu, do którego ładowane są wtyczki, stworzenie sposobu na identyfikację i walidację takiego zewnętrznego kodu, a także jego uruchomienie.

Managed Extensibility Framework pozwala zarówno na tworzenie wtyczek, jak i aplikacji, które będę z nich korzystać. Framework umożliwia także rozszerzanie platformy o własne rozwiązania i biblioteki, bazując na MEF. Visual Studio korzysta z MEF i pozwala w ten sposób na pisanie dodatków, powiększających możliwości IDE.

Composition container, catalog, parts

Aplikacje pisane w MEF bazują na podstawowych elementach: kontener z kompoyzcją (composition container), katalog (catalog) i elementy (parts).

  • parts - podstawowa jednostka MEF, która umożliwia import i eksport funkcjonalności poprzez kontrakt; kontrakt (contract) jest sposobem na łączenie poszczególnych części
  • composition container - jest to rdzeń rozwiązań MEF, to tutaj przechowane są dostępne elementy (parts), zarządza się instancjami poszczególnych elementów i w tym miejscu następuje kompozycja (łączenie wymaganych części [imports] z tymi dostępnymi [exports])
  • catalog - jest to abstrakcyjne miejsce, które gromadzi elementy do użycia w kontenerze z kompozycją; MEF udostępnia katalogi, które pozwalają na odkrywanie (discover) elementów (parts) poprzez typy (TypeCatalog), assembly (AssemblyCatalog), foldery (DirecotryCatalog) i inne katalogi (AggregateCatalog)

MEF w praktyce

Zobaczmy zatem jak sprawuje się MEF. W tym celu tworzymy zwykłą aplikację konsolową, którą wykorzysta mechanizm pluginów (pamiętając jednocześnie o dodaniu referencji System.ComponentModel.Composition!).

Aplikacja konsolowa będzie uruchamiała naszego hosta, który to będzie rozszerzony o autorski plugin.


using System;

namespace MEFExample
{
    class Program
    {
        static void Main(string[] args)
        {
            HostApp hostApp = new HostApp();
            hostApp.Start();
            //just wait to see results
            Console.ReadKey();
        }
    }
}

Stwórzmy zatem prosty interface do pluginu, a także jego implementację.


namespace MEFExample
{
    public interface IMessagePlugin
    {
        string GetMessage();
    }
}


using System.ComponentModel.Composition;

namespace MEFExample
{
    [Export(typeof(IMessagePlugin))]
    public class MessagePlugin : IMessagePlugin
    {
        public string GetMessage()
        {
            return "Message from plugin";
        }
    }
}

W ty miejscu nasza implementacja pluginu jest oznaczona atrybutem Export. Oznacza to tyle, że eksportujemy nasz kod (implementację) do kontenera.

Teraz przyszedł czas na implementację naszego programu hostującego, który będzie rozszerzany przez plugin.


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

namespace MEFExample
{
    public class HostApp
    {
        [Import]
        public IMessagePlugin MessageToClient { get; set; }

        public void Start()
        {
            Compose();
            Console.WriteLine(MessageToClient.GetMessage());
        }

        private void Compose()
        {
            AssemblyCatalog catalog = 
             new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
            CompositionContainer container = new CompositionContainer(catalog);
            container.ComposeParts(this);
        }
    }
}

Zauważmy dwa ważne elementy: atrybut Import i metodę Compose. Dodanie atrybutu Import zaimportuje z kontenera implementację IMessagePlugin, która została dodana wcześniej przy eksporcie.

Metoda Compose jest najważniejsza tutaj. W tym miejscu powiadamiamy MEF, iż abstrakcyjny katalog powinien wyszukać elementów (parts) z biblioteki, a tą biblioteką jest aktualnie wykonywane assembly:


AssemblyCatalog catalog = 
             new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());

W kolejnym kroku dodajemy powyższy katalog do kontenera z kompozycją:


CompositionContainer container = new CompositionContainer(catalog);

Na koniec łączymy całość i przekazujemy jako parametr instancję, która ma zaimportować elementy z kontenera. W naszym przypadku jest to this, czyli aktualna instancja HostApp, zawierająca proporcję MessageToClient z atrybutem Import.


container.ComposeParts(this);

Po uruchomieniu otrzymamy taki ekran:

MEF i Visual Studio

Po co nam wiedza o MEF? Otóż edytor w Visual Studio został oparty na MEF. Zatem napisanie jakiegokolwiek pluginu do IDE od Microsoftu będzie wymagało dotknięcia do MEF. O czym już konkretniej w kolejnej części.

Źródła dostępne są na GitHubie (branch master i POC): https://github.com/djfoxer/healthyWithVS/
Szanowna Użytkowniczko! Szanowny Użytkowniku!
×
Aby dalej móc dostarczać coraz lepsze materiały redakcyjne i udostępniać coraz lepsze usługi, potrzebujemy zgody na dopasowanie treści marketingowych do Twojego zachowania. Twoje dane są u nas bezpieczne, a zgodę możesz wycofać w każdej chwili na podstronie polityka prywatności.

Kliknij "PRZECHODZĘ DO SERWISU" lub na symbol "X" w górnym rogu tej planszy, jeżeli zgadzasz się na przetwarzanie przez Wirtualną Polskę i naszych Zaufanych Partnerów Twoich danych osobowych, zbieranych w ramach korzystania przez Ciebie z usług, portali i serwisów internetowych Wirtualnej Polski (w tym danych zapisywanych w plikach cookies) w celach marketingowych realizowanych na zlecenie naszych Zaufanych Partnerów. Jeśli nie zgadzasz się na przetwarzanie Twoich danych osobowych skorzystaj z ustawień w polityce prywatności. Zgoda jest dobrowolna i możesz ją w dowolnym momencie wycofać zmieniając ustawienia w polityce prywatności (w której znajdziesz odpowiedzi na wszystkie pytania związane z przetwarzaniem Twoich danych osobowych).

Od 25 maja 2018 roku obowiązuje Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 (określane jako "RODO"). W związku z tym chcielibyśmy poinformować o przetwarzaniu Twoich danych oraz zasadach, na jakich odbywa się to po dniu 25 maja 2018 roku.

Kto będzie administratorem Twoich danych?

Administratorami Twoich danych będzie Wirtualna Polska Media Spółka Akcyjna z siedzibą w Warszawie, oraz pozostałe spółki z grupy Wirtualna Polska, jak również nasi Zaufani Partnerzy, z którymi stale współpracujemy. Szczegółowe informacje dotyczące administratorów znajdują się w polityce prywatności.

O jakich danych mówimy?

Chodzi o dane osobowe, które są zbierane w ramach korzystania przez Ciebie z naszych usług, portali i serwisów internetowych udostępnianych przez Wirtualną Polskę, w tym zapisywanych w plikach cookies, które są instalowane na naszych stronach przez Wirtualną Polskę oraz naszych Zaufanych Partnerów.

Dlaczego chcemy przetwarzać Twoje dane?

Przetwarzamy je dostarczać coraz lepsze materiały redakcyjne, dopasować ich tematykę do Twoich zainteresowań, tworzyć portale i serwisy internetowe, z których będziesz korzystać z przyjemnością, zapewniać większe bezpieczeństwo usług, udoskonalać nasze usługi i maksymalnie dopasować je do Twoich zainteresowań, pokazywać reklamy dopasowane do Twoich potrzeb. Szczegółowe informacje dotyczące celów przetwarzania Twoich danych znajdują się w polityce prywatności.

Komu możemy przekazać dane?

Twoje dane możemy przekazywać podmiotom przetwarzającym je na nasze zlecenie oraz podmiotom uprawnionym do uzyskania danych na podstawie obowiązującego prawa – oczywiście tylko, gdy wystąpią z żądaniem w oparciu o stosowną podstawę prawną.

Jakie masz prawa w stosunku do Twoich danych?

Masz prawo żądania dostępu, sprostowania, usunięcia lub ograniczenia przetwarzania danych. Możesz wycofać zgodę na przetwarzanie, zgłosić sprzeciw oraz skorzystać z innych praw wymienionych szczegółowo w polityce prywatności.

Jakie są podstawy prawne przetwarzania Twoich danych?

Podstawą prawną przetwarzania Twoich danych w celu świadczenia usług jest niezbędność do wykonania umów o ich świadczenie (tymi umowami są zazwyczaj regulaminy). Podstawą prawną przetwarzania danych w celu pomiarów statystycznych i marketingu własnego administratorów jest tzw. uzasadniony interes administratora. Przetwarzanie Twoich danych w celach marketingowych realizowanych przez Wirtualną Polskę na zlecenie Zaufanych Partnerów i bezpośrednio przez Zaufanych Partnerów będzie odbywać się na podstawie Twojej dobrowolnej zgody.