Microsoft Managed Extensibility Framework

    Четвертого июня группа разработчиков Microsoft представила CTP проекта Managed Extensibility Framework (MEF). MEF – это механизм, который позволяет минимумом кода внедрить в проекты поддержку расширяемости (например, плагинов).

    Ссылка на сообщение от разработчиков: weblogs.asp.net/whaggard/archive/2008/06/04/first-managed-extensibility-framework-mef-bits-released.aspx

    Скачать CTP вместе с примерами и документацией можно здесь: code.msdn.microsoft.com/mef
    Далее я приведу короткий пример из документации для лучшего понимания, что такое MEF.

    Итак, что дает MEF? Рассмотрим первый пример из документации к проекту. Первый кусок кода описывает простое свойство, которое влияет на заголовок кнопки.
    [Import(«ButtonCaption»)]
    public String ButtonCaption
    {
      get { return theButton.Content.ToString(); }
      set { theButton.Content = value; }
    }
    * This source code was highlighted with Source Code Highlighter.


    Обратите внимание, что это свойство помечается атрибутом [Import(«ButtonCaption»)]. Это, в своем роде, отметка того, где данные могут быть изменены через внешние расширения.

    Далее определяется простейшее расширение:
    public class ExampleStringProvider
    {
      [Export(«ButtonCaption»)]
      public String providedCaption
      {
        get { return «MEF Hello World!!»; }
      }
    }
    * This source code was highlighted with Source Code Highlighter.


    Как видно из кода, в классе определен источник данных через [Export(«ButtonCaption»)], который указывает, что данный класс умеет устанавливать значения заголовка для кнопки.

    В конце концов, оба куска кода смешиваются, для того, чтобы встретить друг друга:
    public MyHelloWorld()
    {
      InitializeComponent();
      CompositionContainer container =
                 new CompositionContainer();
      container.AddComponent<MefHelloWorld.MyHelloWorld>(this);
      container.AddComponent(new
       ExampleStringProvider());
      container.Bind();
    }* This source code was highlighted with Source Code Highlighter.


    Данный код регистрирует взаимосвязанные компоненты в контейнере (composition container) и, вызовом метода Bind, производит связывание данных из расширения на имеющиеся свойство. Как вариант, класс расширения ExampleStringProvider можно заменить на другой класс, который предоставляет иной функционал, например, который вместо текста выводит дату:
    public class DateStringProvider
    {
      [Export(«ButtonCaption»)]
      public String providedCaption
      {
        get { return DateTime.Today.ToString(); }
      }
    }
    * This source code was highlighted with Source Code Highlighter.


    Как видно из простого примера, MEF реализует механизм связывания данных во время исполнения кода посредством механизма отражения. Идея лежала на поверхности, и я рад, что Микрософт озаботились созданием удобной и мощной библиотеки реализующей механизм расширения функционала кода.

    Комментарии 1

      0
      Очередной DI-контейнер, вид сбоку. Да и еще с туманными перспективами:
      ...we don’t yet know whether or when we will ship this

      (отсюда).

      Хотя утипизация довольно интересна там.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое