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:
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.
FileSystemWatcher
genera eventos en subprocesos del grupo de subprocesos del sistema (a menos que utilice la propiedadSynchronizingObject
). Tenga en cuenta que si llama aDirectoryCatalog.Refresh
desde otro subproceso, debeisThreadSafeFlag
CompositionContainer
conisThreadSafeFlag
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.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 elAppdomain
). Eso también significa que aún no puede eliminar o sobrescribir un ensamblaje mientras la aplicación se está ejecutando.