servicios publico publica privadas curso catalogo bienes asociaciones c# plugins mef

c# - publica - curso asociaciones publico privadas 2018



¿Cómo descubrir nuevas partes de MEF mientras se ejecuta la aplicación? (1)

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.

Este es mi código ahora mismo:

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); } }


Puede usar FileSystemWatcher para detectar nuevas DLL que se eliminan en su carpeta de complementos. Luego puede manejar dichos eventos llamando a DirectoryCatalog.Refresh o AggregateCatalog.Catalogs.Add para actualizar la composición de MEF con las partes nuevas.

Algunas cosas a tener en cuenta:

  1. Debe marcar sus importaciones de MEF como diseñadas para lidiar con la recomposición, como se explica en la sección de guía de programación de MEF sobre Recomposición . De lo contrario, MEF generará un error cuando intentes actualizarlos.

  2. FileSystemWatcher genera eventos en subprocesos del grupo de subprocesos del sistema (a menos que utilice la propiedad SynchronizingObject ). Tenga en cuenta que si llama a DirectoryCatalog.Refresh desde otro subproceso, debe isThreadSafeFlag CompositionContainer con 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 catálogos sacándolos de una colección AggregateCatalog.Catalogs . Pero no hay forma de descargar los ensamblados asociados (excepto al descargar todo el Appdomain ). Eso también significa que aún no puede eliminar o sobrescribir un ensamblaje mientras la aplicación se está ejecutando.