SatisfyImportsOnce против ComposeParts

Может ли кто-нибудь объяснить разницу между 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;
    }
}
15
задан BJ Myers 19 May 2015 в 23:26
поделиться