Whither Managed Extensibility Framework for.NET?

Czy ktoś dużo pracował z Microsoft Managed Extensibility Framework (MEF)? Wygląda na to, że stara się być wszystkim dla wszystkich - to menedżer dodatków! To kacze pisanie! Zastanawiam się, czy ktoś ma z tym doświadczenie, pozytywne czy negatywne.

Obecnie planujemy użyć ogólnej implementacji IoC Ala MvcContrib dla naszego następnego dużego projektu. Powinniśmy wrzucić MEF do miksu?

 21
Author: Chilledrat, 2008-09-03

9 answers

Nie dążymy do tego, aby MEF był uniwersalnym MKOl. Najlepszym sposobem na zastanowienie się nad aspektami IoC MEF jest szczegółowe wdrożenie. Używamy IoC jako wzorca, ponieważ jest to świetny sposób na rozwiązanie problemów, które chcemy rozwiązać.

MEF koncentruje się na rozciągliwości. Kiedy myślisz o MEF, spójrz na to jako na inwestycję w rozwój naszej platformy. Nasze przyszłe produkty i platforma będą wykorzystywać MEF jako standardowy mechanizm rozszerzalności. Produkty innych firm i ramy będą również mogły wykorzystać ten sam mechanizm. Przeciętny "użytkownik" MEF będzie autorem komponentów, które MEF będzie zużywał i nie będzie bezpośrednio zużywał MEF w swoich aplikacjach.

Wyobraź sobie, kiedy chcesz rozszerzyć naszą platformę w przyszłości, upuść dll w folderze bin i gotowe. Aplikacja z obsługą MEF świeci się wraz z nowym rozszerzeniem. Taka jest wizja MEF.

 33
Author: Glenn Block,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-17 00:31:25

Ten post odnosi się do Managed Extensibility Framework Preview 2.

Więc przejrzałem MEF i napisałem szybki "Hello World", który jest przedstawiony poniżej. Muszę powiedzieć, że łatwo było się w to zagłębić i zrozumieć. System katalogów jest świetny i sprawia, że samo rozszerzenie MEF jest bardzo proste. To trywialne, aby wskazać go na katalogu addin assemblies i pozwolić mu zająć się resztą. Dziedzictwo MEF Ala Prism na pewno przejawia się przez, ale myślę, że byłoby dziwne, gdyby nie, biorąc pod uwagę, że oba frameworki dotyczą kompozycji.

Myślę, że to, co najbardziej trzyma się w moim craw, to "magia" _container.Compose (). Jeśli spojrzysz na klasę HelloMEF, zobaczysz, że pole pozdrowień nigdy nie jest inicjowane przez żaden z kodu, co po prostu wydaje się Zabawne. Myślę, że wolę sposób, w jaki działają kontenery IoC, gdzie wyraźnie prosi się kontener o zbudowanie obiektu dla Ciebie. Zastanawiam się, czy jakiś rodzaj" nic "lub" pusty " generic initializer może być w porządku. tj.

private IGreetings greetings = CompositionServices.Empty<IGreetings>();

To przynajmniej wypełnia obiekt "czymś", dopóki kod kompozycji kontenera nie uruchomi się, aby wypełnić go prawdziwym"czymś". Nie wiem - to trochę puste słowa kluczowe Visual Basic lub nic, co zawsze mi się nie podobało. Jeśli ktoś jeszcze ma jakieś przemyślenia na ten temat, chciałbym je usłyszeć. Może to jest coś, o czym muszę zapomnieć. Jest oznaczony atrybutem big fat [Import], więc nie jest to kompletna tajemnica czy coś.

Kontrolowanie życia obiektu nie jest oczywiste, ale domyślnie Wszystko jest singletonem, chyba że dodasz atrybut [CompositionOptions] do wyeksportowanej klasy. To pozwoli Ci określić albo Factory albo Singleton. Miło by było, gdyby w pewnym momencie do tej listy dodano Pooled.

Nie bardzo rozumiem, jak działają funkcje pisania kaczek. Wygląda to bardziej na Wtrysk metadanych przy tworzeniu obiektu, niż pisanie kaczek. I wygląda na to, że można dodać tylko jedną dodatkową kaczkę. Ale jak już powiedziałem, nie jestem jeszcze pewien, jak te funkcje działają. Mam nadzieję, że mogę wrócić i wypełnić to później.

Myślę, że dobrym pomysłem byłoby skopiowanie plików DLL, które są ładowane przez DirectoryPartCatalog. Teraz biblioteki DLL są zamknięte, gdy MEF je zdobędzie. Pozwoli to również na dodanie kontrolera katalogów i wyłapanie zaktualizowanych dodatków. Byłoby miło...

Wreszcie, martwię się o to, jak zaufane są biblioteki DLL addin i jak, lub czy, MEF będzie zachowuj się w środowisku częściowego zaufania. Podejrzewam, że aplikacje wykorzystujące MEF będą wymagały pełnego zaufania. Rozsądne może być również załadowanie dodatków do ich własnego AppDomain. Wiem, że to działa na System.AddIn, ale umożliwiłoby to bardzo wyraźne oddzielenie addinów użytkownika od addinów systemowych.

Dość gadania. Oto Hello World w MEF i C#. Smacznego!
using System;
using System.ComponentModel.Composition;
using System.Reflection;

namespace HelloMEF
{
    public interface IGreetings
    {
        void Hello();
    }

    [Export(typeof(IGreetings))]
    public class Greetings : IGreetings
    {
        public void Hello()
        {
            Console.WriteLine("Hello world!");
        }
    }

    class HelloMEF : IDisposable
    {
        private readonly CompositionContainer _container;

        [Import(typeof(IGreetings))]
        private IGreetings greetings = null;

        public HelloMEF()
        {
            var catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
            _container = new CompositionContainer(catalog);
            var batch = new CompositionBatch();
            batch.AddPart(this);
            container.Compose(batch);

        }

        public void Run()
        {
            greetings.Hello();
        }

        public void Dispose()
        {
            _container.Dispose();
        }

        static void Main()
        {
            using (var helloMef = new HelloMEF())
                helloMef.Run();
        }
    }
}
 8
Author: Andy S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-13 01:05:00

W kwestii bezpieczeństwa rozszerzeń, które ładują MEF (przepraszam, że jeszcze nie mam dość punktów:)), miejsce na rozwiązanie tego problemu znajduje się w katalogu. Katalogi MEF są całkowicie pluggable, więc można napisać niestandardowy katalog, który waliduje klucze montażu, itp Przed załadowaniem. Możesz nawet użyć CAS, jeśli tego chcesz. Szukamy możliwości dostarczenia hooków, które pozwolą ci to zrobić bez konieczności pisania katalogu. Źródło aktualnych katalogów jest jednak dostępne bezpłatnie. Podejrzewam minimum to ktoś (może z naszego zespołu) wdroży jeden i wrzuci go do projektu extension/contrib na CodePlex.

 4
Author: Glenn Block,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-19 02:07:07

Duck typing nie będzie wysyłany w V1, chociaż jest w bieżącym spadku. W przyszłości wymienimy go na wtykowy mechanizm adaptera, w którym można zaczepić mechanizm pisania kaczek. Powodem, dla którego przyjrzeliśmy się pisaniu kaczek, jest rozwiązanie scenariuszy wersjonowania. Za pomocą Duck Typing można usunąć współdzielone odniesienia między eksporterami i importerami, umożliwiając w ten sposób współistnienie wielu wersji Umowy.

 4
Author: Glenn Block,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-19 02:09:00

Andy, wydaje mi się, że Glenn Block odpowiada na wiele (naturalnych) pytań w tym wątku na forum MSDN MEF:

Porównanie składu z tradycyjnymi pojemnikami IoC .

W pewnym stopniu powyższa odpowiedź Artema jest poprawna w stosunku do pierwotnego zamiaru MEF, którym jest rozciągliwość, a nie kompozycja. Jeśli interesuje Cię przede wszystkim kompozycja, skorzystaj z Jeśli, z drugiej strony, chodzi przede wszystkim o rozszerzalność, a następnie wprowadzenie katalogów, części, tagowanie metadanych, pisanie kaczek i opóźnione ładowanie wszystkich sprawiają, że kilka ciekawych możliwości. Ponadto Krzysztof Cwalina strzela tutaj, aby wyjaśnić, jak MEF i System.Addiny są ze sobą powiązane.

 2
Author: J Healy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-12 00:20:51
 2
Author: Aaron Marten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-27 15:11:40

To nie jest wstrzyknięcie pojemnika kontrolnego. Jest to struktura wsparcia plug-in.

 1
Author: Artem Tikhomirov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 22:01:14

Powiedziałbym, że biorąc pod uwagę, że będzie wisieć poza przestrzenią nazw' System ' W frameworku. NET 4.0, że nie można pójść zbyt daleko źle. Ciekawie będzie zobaczyć, jak rozwija się MEF i jaki wpływ ma Hamilton Verissimo (Castle) na kierunek MEF.

Jeśli kwacze jak kaczka, może być częścią obecnego stada kontenerów MKOl...

 1
Author: J Healy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-11 19:17:45

Bardziej szczegółowa dyskusja na ten temat w tym poście i komentarzach

Http://mikehadlow.blogspot.com/2008/09/managed-extensibility-framework-why.html

 0
Author: Glenn Block,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 07:20:54