Поручить MEF использовать любые доступные сборки - PullRequest
5 голосов
/ 17 ноября 2009

Я впервые испытываю платформу Managed Extensibility Framework в бета-версии 2 Visual Studio 2010, используя System.ComponentModel.Composition из .net-4.0.

Мне не удалось заставить CompositionContainer найти мои сборки реализации, используя две альтернативные подпрограммы ниже.

Первая попытка (это работало в более старом выпуске MEF для codeplex):

var composition = new CompositionBatch();
composition.AddPart(this);
var container = new CompositionContainer(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));
container.Compose(composition);

Вторая попытка (думаю, это сработало в бета-версии 1):

var aggregateCatalog = new AggregateCatalog(
    new AssemblyCatalog(Assembly.GetExecutingAssembly()),
    new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));
var compositionContainer = new CompositionContainer(aggregateCatalog);
compositionContainer.ComposeParts(this);

Есть ли новый способ сделать это в бета-версии 2?

РЕДАКТИРОВАТЬ: Оказалось, не имеет ничего общего с композицией. У меня было статическое свойство, представляющее мою импортированную реализацию:

[Import] public static ILog Log { get; set; }

который должен был быть:

[Import] public ILog Log { get; set; }

Я отметил ответ Даниила как принятый, потому что мудрый совет отладки более тщательным образом решил проблему.

Ответы [ 2 ]

1 голос
/ 17 ноября 2009

Что не получается? Есть ли импорт, который вы ожидаете удовлетворить, который не удовлетворяется? Вы вызываете GetExports (), и он не работает?

Вы можете включить отладчик после создания каталога и навести курсор мыши на переменную aggregateCatalog, чтобы просмотреть ее и увидеть, какие части в ней. Я предполагаю, что части, вероятно, находятся в каталоге, и проблема где-то еще в вашем коде. Вероятной причиной является то, что у вас есть импорт коллекции, который использует атрибут [Import] вместо [ImportMany], и / или что ваши детали отклоняются, поскольку они имеют импорт, который не может быть удовлетворен.

0 голосов
/ 18 ноября 2009

Если вы посмотрите на метод Compose в SoapBox Core Host , вы можете увидеть его с помощью DirectoryCatalog, чтобы найти все детали в каталоге. Однако это не скомпилировано для .NET 4, а только для предварительной версии MEF:

    private bool Compose()
    {
        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new DirectoryCatalog("."));

        _container = new CompositionContainer(catalog);

        try
        {
            _container.ComposeParts(this);
        }
        catch (CompositionException compositionException)
        {
            MessageBox.Show(compositionException.ToString());
            return false;
        }
        return true;
    }
...