У меня есть экземпляр объекта, и я хочу получить каталог MEF, содержащий этот экземпляр объекта, экспортированный как определенный тип интерфейса.Как я могу это сделать?
TypeCatalog здесь не кажется работоспособным, потому что (а) он создает новый экземпляр вместо использования существующего, и (б) ему требуется типиметь атрибут [Экспорт].В моем случае экземпляр происходит из системы метаданных MEF, поэтому MEF создает базовый тип, и я не могу добавить к нему атрибуты.
Насколько я могу судить, обычный совет: если выПолучив существующий экземпляр, вы должны добавить его в контейнер (например, через CompositionBatch ), а не в каталог .Но когда я добавляю этот экземпляр, я также добавляю целый набор типов AssemblyCatalog, все в одной операции.Я также хочу иметь возможность удалить все эти типы позже.Для меня более логично объединить все в AggregateCatalog.Таким образом, я могу добавить сборку и экземпляр в одну атомарную операцию и удалить их все одинаково.
Например:
// Bootstrapper code to initialize MEF:
public void Configure() {
_selectedGameCatalog = new AggregateCatalog();
var globalCatalog = new AggregateCatalog(_selectedGameCatalog);
_container = new CompositionContainer(globalCatalog);
// ... more MEF initialization ...
}
// Sometime later, I want to add more stuff to the MEF ecosystem:
public void SelectGame(Lazy<Game, IGameMetadata> entry) {
var newCatalog = new AggregateCatalog();
// Make the assembly available to import:
newCatalog.Catalogs.Add(new AssemblyCatalog(entry.Value.GetType().Assembly));
// I also want the metadata to be available to import:
IGameMetadata metadata = entry.Metadata;
newCatalog.Catalogs.Add(MakeCatalogFromInstance<IGameMetadata>(metadata));
// Replace whatever game was selected before:
_selectedGameCatalog.Catalogs.Clear();
_selectedGameCatalog.Catalogs.Add(newCatalog);
}
Часть, которую я наденуне знаю, как это сделать "MakeCatalogFromInstance".Как я могу создать каталог, который содержит существующий экземпляр (зарегистрированный как определенный тип)?
Или, в качестве альтернативы, если я все делаю неправильно, есть ли лучший способ подключить весь каталог и существующего экземпляра одновременно в MEF, с возможностью позже отключить их все и заменить чем-то другим?