我有一个对象实例,并且我想最终获得一个包含该对象实例的MEF目录,并将其导出为特定的接口类型。我怎样才能做到这一点?如何将现有实例添加到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中,并且能够再次将它们全部拔出后来并用其他东西替换它们?
可能是一个答案http://stackoverflow.com/questions/5191316/adding-an-instance-to-a-mef-container – 2012-11-21 17:54:21