gpt4 book ai didi

mef - 如何将现有实例添加到 MEF 目录?

转载 作者:行者123 更新时间:2023-12-01 17:38:33 25 4
gpt4 key购买 nike

我有一个对象实例,并且我希望最终得到一个包含该对象实例并导出为特定接口(interface)类型的 MEF 目录。我怎样才能做到这一点?

TypeCatalog在这里似乎不起作用,因为(a)它创建一个新实例而不是使用现有实例,并且(b)它要求类型具有 [Export] 属性。就我而言,实例来自 MEF 的元数据系统,因此 MEF 创建基础类型,但我无法向其添加属性。

据我所知,通常的建议是,如果您有现有实例,则应该将其添加到容器(例如通过 CompositionBatch ),而不是< em>目录。但是,当我添加此实例时,我还添加了整个 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,并且能够稍后再次拔掉它们并用其他东西替换它们?

最佳答案

我认为最好将类型添加到目录中,然后将实例添加到容器中。

目录包含零件定义。零件定义用于创建零件。 (其类型为 ComposablePartDefinitionComposablePart 。)因此,理论上您可以编写自己的目录和部件定义,当 CreatePart 时,它始终返回与实例相对应的部件。被称为。但目录并不是真正设计用于这种方式的。

关于mef - 如何将现有实例添加到 MEF 目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5615880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com