Может кто-нибудь объяснить разницу между SatisfyImportsOnce
и ComposeParts
и почему кто-то будет работать там, где другой не делает?
В частности, у меня есть веб-приложение MVC, в котором я использую MEF. Ниже приведен код (из этого приложения), который работает, когда я использую SatisfyImportsOnce
, но не использую ComposeParts
. Я понимаю, что ComposeParts
создает составные части из массива атрибутивных объектов и составляет их в указанном контейнере композиции и что SatisfyImportsOnce
составляет указанную часть с использованием указанной композиции композиции. Для моего простого мозга обезьян, хотя английский и отличается, они семантически одинаковы. Оба используют CompositionContainer
для выталкивания экспортированных типов по целям импорта.
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;
}
}