Microsoft Extensibility Framework en codeplex

El viernes pasado apareció la primera entrega del

Microsoft Extensibility Framework (en codeplex)

Es un proyecto .NET de Microsoft, que será incorporado dentro del propio framework de .NET en el futuro. Pueden visitar la página y bajarse el código. Necesitan un Visual Studio 2008 y .NET 3.5 instalado para poder usarlo. Viene con el código fuente, y el compilado de tres ejemplos.

El problema que ataca es: necesitamos una aplicación extensible, que soporte la incorporación dinámica de plugins. Uno de los ejemplos es el clásico juego del Tetris, esta vez en versión WPF (Windows Presentation Foundation). El punto de extensibilidad son las propias piezas. Pueden codificar una librería .DLL con la definición de nuevas piezas, y se pueden agregar al juego andando. Los otros dos ejemplos son un Outlook y Windows Explorer extensibles.

Este problema MEF lo resuelve dando:

  • Una forma estándar de consumir extensiones external en una aplicación. También permite que una aplicación se exponsa como extensión de otra. Una extensión puede depender de otra, y MEF se ocupa de conectarlas.
  • Una forma de descubrir y cargas las extensiones disponibles.
  • Atributos que permiten colocar metadata adicional en los componentes de la extensión.

Cómo funciona

Hay un nuevo namespace System.ComponentModel.Composition. El ComposablePart es el elemento básico de este namespace. Una ComposablePart ofrece uno o varios Exports, y a su vez, puede depender de uno o más Imports, que son servicios provistos por otras partes. Generalmente, una Part ofrece una instancia de un tipo que le indicamos, para que sea consumida por el resto del sistema, pero como otras partes de MEF, esta conducta puede ser cambiada.

Hay Contracts, que son textos, strings, que describen un contrato que sirve de puente entre los Export e Import. Hay Catalogs, que da acceso a las ComposableParts que contengan. Pero también existe el concepto de Container, donde se colocan las partes y catálogos que a uno le interesa. El contenedor resuelve las dependencias de las partes y expone las partes exportadas.

No hace falta armar las ComposablePart, sino que podemos agregar atributos a nuestras clases, para indicar que exportan tal tipo de parte. Por ejemplo, una nueva pieza en el Tetris, se puede declarar como:

[Export(typeof(IShape))] [Shape(ShapeType.GameShape, "Diagonal shape", 0)] [CompositionOptions(CreationPolicy = CreationPolicy.Factory)] public class Diagonal : RegularShape {

El atributo Export es el que hace que MEF la reconozca como una parte proveedora de IShape, una interface que el resto del juego utiliza para interactuar con una pieza.

El uso de atributos hace que MEF pueda determinar las parts, imports y exports, simplemente descubriéndolas en un assembly, usando reflection.

Un ejemplo

Aclaremos un poco los conceptos de arriba, con un pequeño ejemplo. Supongamos que nuestra aplicación tiene que usar una parte que sea capaz de enviar un mensaje, a algun destino. La interfaz será:

public interface IMessageSender { void Send(string message); }

En nuestro objeto de aplicación, podemos necesitar ese servicio desde una propiedad marcada con Import:

[Import]
public IMessageSender MessageSender { get; set; }

Tenemos una implementación concreta en:

[Export(typeof(IMessageSender))] public class EmailSender : IMessageSender { public void Send(string message) { Console.WriteLine(message); } }

Usando un container, agregamos las partes (nuestro objeto aplicación, nuestro proveedor de servicio de envío de mensaje):

private void Compose() { var container = new CompositionContainer(); container.AddPart(new EmailSender()); container.AddPart(this); container.Compose(); }


El método Compose() del contenedor, es el que se encarga de conectar las partes que agregamos, resolviendo los imports y exports.


Para más información, visitar:


Overview para aprender más sobre MEF


Guide con la guía de programación


Samples descripción de los ejemplos


Downloads para bajar un .zip con el código y ejecutable.


Pueden leer los blogs del equipo, como


MEF on CodePlex de Krzysztof Cwalina


MEF Making its debut on Codeplex de Glenn Block


MEF and more de Hamilton Verissimo, el desarrollador fundador del project Castle


Managed Extensibility Framework on CodePlex de Brad Adams


Consultas y retroalimentación del proyecto en el foro de MSDN:


http://forums.msdn.microsoft.com/en-US/MEFramework/threads/


El MEF ha comenzado ha ser probado por la comunidad. Un aviso temprano de Miguel de Icaza, menciona que la licencia impide su uso fuera de la plataforma Windows.


Nos leemos!


Angel “Java” Lopez
http://www.ajlopez.com/

This entry was posted in 1389. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>