【问题标题】:Lazy Loading DLL's with MEF使用 MEF 延迟加载 DLL
【发布时间】:2010-12-06 22:23:48
【问题描述】:

我正在使用 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% 会被使用。

【问题讨论】:

    标签: c# .net mef


    【解决方案1】:

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

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

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

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

    Lazy&lt;T&gt; 所做的唯一一件事就是推迟调用部件的构造函数 的那一刻。这已经可以加快速度,但不会推迟程序集的加载。

    【讨论】:

      【解决方案2】:

      MEF 的优点是(默认情况下)不初始化对象; MEF 将匹配任何与您的导入匹配的声明的 [Export],然后 MEF 为您初始化它们。如果您的依赖项本身具有依赖项,MEF 将继续沿链向下运行,直到您的整个图得到解决。

      使用 Lazy(而不是 T)只是意味着实例化将被延迟,直到您访问该依赖项。如果您正在调试,但看不到该依赖项何时初始化,则需要访问 Value 属性以启动实例化。

      MEF 与大多数其他 IoC 容器之间存在一些重大差异(因为 MEF 只关注可扩展性/组合),但它类似于 IoC 容器在注册类型后实例化依赖项的方式解决某事。

      如果您对如何更改某些实例化行为感到好奇,这里有一些关于创建策略的详细信息:http://mef.codeplex.com/wikipage?title=Parts%20Lifetime

      【讨论】:

        【解决方案3】:

        这是一个非常老的问题,但对于任何寻求解决方案的人来说,我最近实现了一个LazyAssemblyCatalog,它可以延迟加载插件程序集,同时仍然使插件元数据可用,而无需加载这些程序集。它的概念与@Wim 在他的回答中提到的CachedAssemblyCatalog 非常相似。我希望这对任何人都有一些帮助。

        【讨论】:

          猜你喜欢
          • 2010-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-11
          • 1970-01-01
          • 2021-05-06
          • 1970-01-01
          • 2021-11-23
          相关资源
          最近更新 更多