Wydaje mi się, że była to najlepsza sesja na TechEd 2009, w jakiej miałem przyjemność brać udział, dlatego postanowiłem poświęcić jej osobną notkę. Wcześniej coś tam słyszałem o MEFie, ale na tyle mało, że chciałem dowiedzieć się więcej, szczególnie, że ta technologia znajduje się na liście moich “TODO” [ostatnio mam wrażenie, że ta lista raczej będzie się wydłużać niż skracać – przyp. autora].

O samej technologii dowiedziałem się, że jest to framework, który największy nacisk kładzie na rozszerzalność i modularność naszych aplikacji. Oczywiście od strony kodu (jak zwykle) to od nas zależy jak napiszemy aplikację i czy będzie ona łatwa do rozszerzania. W każdym razie chodzi o budowanie aplikacji poprzez dynamiczne komponowanie jej z różnych elementów. Co więcej osoby/firmy trzecie mogą pisać własne rozszerzenia do istniejących aplikacji opartych o MEFa – tu doskonałym przykładem jest plugin do VS2010, który wyświetla wiadomości z Twittera (btw. moim zdaniem Twitter sucks). Przy tej okazji należałoby też wspomnieć, że całe VS2010 i chyba również Oslo oparte są właśnie o MEFa, więc MSFT na pewno będzie dbał o ten Framework.

Podstawy MEFa:

  • Export It
  • Import It
  • Compose It
    • Catalog
    • Container

A teraz co te magiczne słówka znaczą. Ogólnie chodzi o coś w rodzaju wstrzykiwania zależności (MEF wspiera CSL). Katalogi “usług” dostępne są na różnych poziomach (Type, Assembly, Directory, Aggregating). Co więcej mamy tutaj dostępne:

  • Lazy Evaluation
  • Context Injection – to jest mega funkcjonalność jak dla mnie, szczególnie jak zobaczyłem to w praktyce, ale o tym na końcu. Możemy też napisać własny catalog. Property AllowRecomposition mówi, czy kontekst może się zmieniać podczas uruchomienia aplikacji.

MEF vs. System.Addin

Pojawia się więc pytanie jak ma się MEF do System.Addin – czy nie jest to kolejne podejście do tego samego. To pytanie padło podczas sesji. Nie do końca. Można w uproszczeniu na MEFa patrzeć jak na architekturę pluginową, ale z tego co zrozumiałem, to chodzi trochę o zmienienie sposobu myślenia – komponujemy aplikacje poprzez dynamiczne łączenie części… Szczerze powiem, że sam nie do końca umiem to wyjaśnić. Mniej więcej czuję o co chodzi, ale gorzej z wytłumaczeniem.

Co do samego System.Addin – na pewno MEF jest prostszy i przyjemniejszy w użyciu niż System.Addin.

MEF nie ma izolacji pomiędzy domenami aplikacji.

MEF + System.Addin – takie połączenie daje izolację pomiędzy domenami aplikacji. Chyba istnieją takie rozwiązania na Codeplex.

Co jeszcze:

  • Dostępna jest już aplikacja ExtensionManager, która pozwala na wybieranie sobie dodatków, które chcemy mieć “zainstalowane” w danej aplikacji.
  • Rozszerzanie .NET Framework – Olson powiedział, że nie wiadomo czy się na to zdecydują, ale być może będzie można pisać własne rozszerzenia do Frameworka. Nie mówił na razie jak, ale takie coś rzucił.
  • Pisanie rozszerzeń do przeglądarek internetowych – już podobno są takie projekty.
  • Chmura + MEF

W praktyce – co było na demo

Na sesji nie zabrakło też części demonstracyjnej. Zawierała w zasadzie dwie części – obie powalające:

  1. Mamy aplikację, która wyświetla dane z jakiegoś źródła. Źródło jest naturalnie wstrzykiwane do samej funkcjonalności wyświetlającej. Piszemy dwóch dostawców danych – jednego online, drugiego offline. W warstwie integracji określamy, że kontener będzie kontekstowy i że o kontekście będzie decydował stan sieci (offline/online). Uruchamiamy aplikację… Dane się wczytały… Wyciągamy wtyczkę sieciową… Mijają 2 sekundy… Dane zostały zamienione na dane z providera Offline… Wkładamy wtyczkę… Mijają 2 sekundy… Dane wracają do tych z providera online…
    Po tej demonstracji długo zbierałem szczękę z podłogi – jak z resztą większość sali. Efekt WOW + 10.
  2. Ta sama aplikacja. Cały czas uruchomiona… W tym czasie my piszemy rozszerzenie, które dodaje nowy przycisk umożliwiający wysłanie wyświetlanych danych mailem. Kompilujemy… Otrzymaną dllkę wrzucamy do odpowiedniego katalogu uruchomionej aplikacji… Czekamy 2 sekundy… Pojawia nam się nowy przycisk z nową funkcjonalnością…
    Efekt WOW + 20.

Z przyczyn czasowych MEF dalej jest na mojej liście TODO, ale myślę, że już niedługo.

Dla zainteresowanych Glenn Block – PM od MEFa będzie w Polsce w ostatnim pełnym tygodniu czerwca.