使用MEF延迟加载DLL

pho*_*tom 5 .net c# mef

我正在用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);

    }
Run Code Online (Sandbox Code Playgroud)

我理解大多数如何使用MEF,除了我没有看到如何初始化DllList对象.我想使用延迟加载,因为在最终系统中,我们有很多选项,任何时候都只会使用大约10%.

Wim*_*nen 6

首先,您尝试将对象导入静态属性.MEF不支持这一点:MEF组成对象,而不是.如果要初始化静态属性,则必须手动执行此操作:

DllList = container.GetExports<IControlModule, IImportComponentCapabilites>();
Run Code Online (Sandbox Code Playgroud)

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

为了真正延迟加载程序集,需要在某处缓存有关哪些部件在这些程序集中可用的信息.MEF目前没有开箱即用的内置缓存机制.但是,在codeplex中ComposablePartCatalogAssemblyCacheMEF源代码中包含的样本中有一个实现.

唯一Lazy<T>能做的就是推迟调用零件构造函数的那一刻.这可以加快速度,但不会推迟加载程序集.