¿Puede alguien explicar la diferencia entre SatisfyImportsOnce
y ComposeParts
y por qué uno funcionaría donde el otro no?SatisfyImportsOnce frente a ComposeParts
Específicamente Tengo una aplicación web MVC que estoy usando MEF. A continuación se muestra un código (de esa aplicación) que funciona cuando uso SatisfyImportsOnce
pero no lo hace cuando uso ComposeParts
. Según entiendo, ComposeParts
crea partes que pueden componerse a partir de una matriz de objetos atribuidos y los compone en el contenedor de composición especificado y que SatisfyImportsOnce
compone la parte especificada mediante el servicio de composición especificado. Para mi simple cerebro de mono, aunque el inglés es diferente, son semánticamente iguales. Ambos usan CompositionContainer
para escupir tipos exportados en los destinos de importación.
public class FormPartCustomatorFactory
{
[ImportMany(typeof(ICustomRenderer), AllowRecomposition = true)]
private readonly List<Lazy<ICustomRenderer, ICustomRendererMetaData>> _rendererImports = new List<Lazy<ICustomRenderer, ICustomRendererMetaData>>();
private readonly Dictionary<string, Lazy<ICustomRenderer, ICustomRendererMetaData>> _renderers;
public static readonly FormPartCustomatorFactory Instance = new FormPartCustomatorFactory();
static CompositionContainer _container;
private FormPartCustomatorFactory()
{
using (var catalog = new DirectoryCatalog(HttpRuntime.BinDirectory, "*.dll"))
{
_container = new CompositionContainer(catalog);
_container.SatisfyImportsOnce(this); // <- Works
// _container.ComposeParts(this); // DOESN'T Work
_renderers = _rendererImports.ToDictionary(q => q.Metadata.Name, q => q);
}
}
~FormPartCustomatorFactory()
{
_container.Dispose();
}
public static ICustomRenderer Find(string name)
{
return Instance._renderers[name].Value;
}
}
Gracias, esta es una excelente respuesta. – Peter