Как расставить приоритеты в разных каталогах в MEF? - PullRequest
5 голосов
/ 01 марта 2012

У меня есть AggregateCatalog, который содержит AssemblyCatalog и DirectoryCatalog.

Я хочу, чтобы они работали так:

  1. Если оба каталога могут найти экспорт, выберите один изDirectoryCatalog.
  2. Если ни один из них не может найти экспорт, просто оставьте импорт равным нулю.
  3. Если только один из них может найти экспорт, просто используйте этот экспорт для заполненияимпорт.

Как мне достичь чего-то подобного?

1 Ответ

8 голосов
/ 02 марта 2012

Вы можете достичь пунктов 1. и 3., поместив каталоги в разные поставщики экспорта, а затем передав поставщики экспорта конструктору CompositionContainer в порядке приоритета, подобном следующему:

var dirCatalog = new DirectoryCatalog(...);
var provider1 = new CatalogExportProvider(dirCatalog);

var assemblyCatalog = new AssemblyCatalog(...);
var provider2 = new CatalogExportProvider(assemblyCatalog);

var container = new CompositionContainer(provider1, provider2);

// link the export providers back to the container, so that they can
// resolve parts from other export providers
provider1.SourceProvider = container;
provider2.SourceProvider = container;

Сейчасвы можете использовать container как обычно, и он сначала будет искать детали в каталоге, а затем - каталог сборки.Вы не получите исключений по количеству элементов, если они присутствуют в обоих.

Для достижения пункта 2. необходимо пометить отдельные операции импорта, чтобы разрешить значение по умолчанию (например, null), с помощью [Import(typeof(SomeType),AllowDefault=true]. * 1010.*

...