gpt4 book ai didi

c# - 使用 MEF 延迟加载 DLL

转载 作者:太空狗 更新时间:2023-10-29 23:03:39 25 4
gpt4 key购买 nike

我正在用 MEF 做我的第一个项目,我真的无法理解如何使用延迟加载。我的代码是 -

public static class MefLoader
{
private static CompositionContainer Container;

[ImportMany(typeof(IControlModule), AllowRecomposition = true)]
private static IEnumerable<Lazy<IControlModule, IImportComponentCapabilites>>
DllList { get; set; }

static MefLoader()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog("."));
Container = new CompositionContainer(catalog);

}

我了解 MEF 的大部分使用方法,只是我看不到如何初始化 DllList 对象。我想使用延迟加载,因为在最终系统中,我们有很多选项,并且一次只能使用大约 10%。

最佳答案

首先,您尝试将对象导入静态属性。 MEF 不支持这一点:MEF 组成对象,而不是。如果你想初始化静态属性,你必须像这样手动完成:

DllList = container.GetExports<IControlModule, IImportComponentCapabilites>();

现在关于延迟加载:DirectoryCatalog创建一个 AssemblyCatalog对于目录中的每个程序集。 AssemblyCatalog MEF 中的实现将在 AssemblyCatalog.Parts 后立即枚举程序集中的所有类型被调用,这将在您从容器中提取导出时发生。这意味着程序集甚至在 MEF 确定它包含它实际需要的部件之前就已加载。

为了真正延迟加载程序集,需要将有关这些程序集中哪些部分可用的信息缓存在某个地方。 MEF 目前没有这种开箱即用的内置缓存机制。但是,有一个 ComposablePartCatalogAssemblyCache MEF source code at codeplex 中包含的示例中的实现.

唯一Lazy<T>所做的是推迟调用该部分的构造函数 的时间。这已经可以加快速度,但不会延迟程序集的加载。

关于c# - 使用 MEF 延迟加载 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4371539/

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