Может ли кто-нибудь объяснить разницу между 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;
}
}