En el anterior articulo vimos el hola mundo de MEF, en este articulo vamos a tratar la recomposición y con esto nos referimos a que MEF nos permite añadir plugins en tiempo de ejecución sin tener que reiniciar nuestro programa.
Para nuestro ejemplo he cambiado un poco el código anterior, he añadido al contrato la propiedad NumCall con la que cada vez que se ejecute el método Hello se mostrará un mensaje con Hola en el idioma seleccionado y el número de veces que lo vamos llamando.
Además he añadido en la ventana un botón de Añadir Plugin que simulara que nos bajamos de internet un plugin nuevo y lo cargamos, la bajada la haremos a a mano copiando en el directorio pugins un nuevo plugin HelloWorldEuskera antes de pulsar el botón. La pantalla quedaría de esta forma.
Para realizar la carga de nuevo plugins MEF nos proporciona el método Refresh en la clase DirectoryCatalog, de manera que el botón “Añadir Plugin” tendría el código.
1 void btnAdd_Click(object sender, RoutedEventArgs e) 2 { 3 //Refrescamos el catalogo para ver si hay mas plugins en el directorio 4 catalog.Refresh(); 5 6 }
Si lo ejecutamos y una vez ejecutado copiamos el nuevo plugin y damos al botón “Añadir Plugin” se nos producirá la excepción
Esto es debido a que no hemos puesto el atributo AllowRecomposition
1 [ImportMany(typeof(HelloWorldContract),AllowRecomposition=true)] 2 private ObservableCollection<HelloWorldContract> pluginsHello = new ObservableCollection<HelloWorldContract>();
Con este atributo nos va a permitir cargar nuevos plugins en tiempo de ejecución y podremos comprobar con la propiedad NumCall que aunque carguemos nuevos plugins en la colección no se crean nuevas instancias manteniendo los valores de las propiedades.
En el anterior articulo vimos la recomposición y como aunque recargásemos los plugins con la opción Refresh