MEF - Как я могу использовать ExportProvider, чтобы выбрать только один экспорт - PullRequest
1 голос
/ 10 августа 2010

я действительно не понимаю, как это работает.

говорят, что у меня есть классы с тем же интерфейсом, которые я хочу экспортировать.

[Export(typeof(IService))]
[ExportMetadata("ExportType", typeof(Service1))]   
public class Service1 : IService
{...}
[Export(typeof(IService))]
[ExportMetadata("ExportType", typeof(Service2))]   
public class Service2 : IService
{...}
[Export(typeof(IService))]
[ExportMetadata("ExportType", typeof(Service3))]   
public class Service3 : IService
{...}

теперь у меня есть один класс, который импортирует IService иэтот класс не имеет значения, для какой службы он нужен.

public class Blup
{
   [ImPortingConstructor]
   public Blup(IService service)
   {}
}

, чего я сейчас пытаюсь добиться, это создать ExportProvider, который выбирает правильный экспорт при создании.

Примерно так:

public TypeExportProvider<TTypeToExport>() : ExportProvider
{}

Я действительно понятия не имею, как должен выглядеть

protected override IEnumerable<Export> GetExportsCore(ImportDefinition definition, AtomicComposition atomicComposition)

.возможно кто-нибудь знает блог, чтобы прочитать об этом.Есть много пользовательских примеров ExportProvider, но не для этой ситуации.

thx

Ответы [ 2 ]

2 голосов
/ 12 августа 2010

Привет, Кент, если вы посмотрите на экспорт, есть метаданные с именем "ExportType", это должен быть селектор для пользовательского поставщика экспорта.но после публикации здесь нашел сообщение в блоге от блока glenn.поэтому для моей особой цели я должен сделать следующее:

var catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
var defaults = new CatalogExportProvider(new TypeCatalog(typeof(Service2))); 
var container = new CompositionContainer(catalog, defaults); 
defaults.SourceProvider = container;

тем не менее было бы неплохо посмотреть, как я могу написать собственный экспортный провайдер, который выбирает правильный экспорт из информации метаданных.Моя проблема в том, как выбрать правильную информацию из ImportDefnition и как я могу установить новый Экспорт (...) в GetExportsCore ().

0 голосов
/ 13 августа 2010

В этой статье журнала MSDN объясняется, как извлекать и использовать экспортные метаданные.По сути, вы используете метод GetExports () в CompositionContainer для получения типов и метаданных, который затем позволяет вам выбирать тип на основе значений метаданных.

...