我有一个对象实例,我想最终得到一个包含该对象实例的 MEF 目录,并导出为特定的接口类型。我怎样才能做到这一点?
TypeCatalog在这里似乎不可行,因为 (a) 它创建一个新实例而不是使用现有实例,并且 (b) 它要求类型具有 [Export] 属性。就我而言,该实例来自 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,并且能够稍后再次拔出它们并用某些东西替换它们别的?