2011-08-04 4 views
12

Estoy usando MEF para cargar complementos en mi aplicación. Todo funciona, pero quiero que se descubran nuevas piezas cuando se guardan en la carpeta de mi aplicación. es posible? DirectoryCatalog tiene un evento modificado, pero no estoy seguro de cómo funciona.¿Cómo descubrir nuevas partes de MEF mientras se ejecuta la aplicación?

Este es mi código en este momento:

public sealed class RevealerFactory 
{ 
    private static readonly Lazy<RevealerFactory> lazy = 
      new Lazy<RevealerFactory>(() => new RevealerFactory()); 

    public static RevealerFactory Instance { get { return lazy.Value; } } 

    private FileSystemWatcher watcher; 

    private RevealerFactory() 
    { 
     Initialize(); 
    } 

    [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] 
    private IEnumerable<Lazy<IRevealer, IRevealerCapabilities>> Revealers { 
     get; 
     set; 
    } 

    public IRevealer GetRevealer(Uri uri) 
    { 
     return (from revealer in Revealers 
       where uri.Host.Equals(revealer.Metadata.Host, 
             StringComparison.OrdinalIgnoreCase) 
        && revealer.Value.IsRevelable(uri) 
       select revealer.Value).FirstOrDefault(); 
    } 

    private void Initialize() 
    { 
     var catalog = new DirectoryCatalog(
      Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 
             + "/SDownloader/Revealers"); 
     var container = new CompositionContainer(catalog); 
     container.ComposeParts(this); 
    } 
} 

Respuesta

21

Puede utilizar el FileSystemWatcher para detectar nuevos archivos DLL que se cayó en la carpeta de plug-in. Luego puede manejar dichos eventos llamando al DirectoryCatalog.Refresh o AggregateCatalog.Catalogs.Add para actualizar la composición de MEF con las partes nuevas.

Algunas cosas a tener en cuenta:

  1. Necesitas marcar sus importaciones MEF estar concebidos para hacer frente a la recomposición, como se explica en la sección de guía de programación MEF en Recomposition. De lo contrario, MEF generará un error cuando intentes actualizarlos.

  2. FileSystemWatcher plantea eventos en subprocesos de grupo de subprocesos del sistema (a menos que utilice la propiedad SynchronizingObject). Tenga en cuenta que si llama al DirectoryCatalog.Refresh desde otro hilo, debe construir el CompositionContainer con el isThreadSafeFlag habilitado. También deberá pensar en la seguridad de los hilos de los responsables de la creación de propiedades que se invocarán cuando se actualice la composición.

  3. También puede eliminar los catálogos sacándolos de una colección AggregateCatalog.Catalogs. Pero no hay forma de descargar los ensamblajes asociados (excepto descargando el Appdomain completo). Eso también significa que aún no puede eliminar o sobrescribir un ensamblaje mientras la aplicación se está ejecutando.

+3

además se puede considerar para permitir la copia sombra para permitir intercambio en caliente de sus asambleas – tartakynov

+0

@tartakynov cómo habilitar la copia sombra? – zionpi

+0

@zionpi echa un vistazo a este tema http://stackoverflow.com/questions/4595304/change-dll-loaded-with-mef – tartakynov

Cuestiones relacionadas