Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 延迟加载DLL';她和MEF在一起_C#_.net_Mef - Fatal编程技术网

C# 延迟加载DLL';她和MEF在一起

C# 延迟加载DLL';她和MEF在一起,c#,.net,mef,C#,.net,Mef,我正在用MEF做我的第一个项目,我严重无法理解如何使用延迟加载。我的代码是- public static class MefLoader { private static CompositionContainer Container; [ImportMany(typeof(IControlModule), AllowRecomposition = true)] private static IEnumerable<Lazy<IControlModule,

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

    }
公共静态类MefLoader
{
私有静态合成容器;
[ImportMany(typeof(IControlModule),AllowRecomposition=true]
私有静态IEnumerable
dllist{get;set;}
静态MefLoader()
{
var catalog=new AggregateCatalog();
catalog.Catalogs.Add(新目录目录(“.”);
容器=新的合成容器(目录);
}

我了解如何使用MEF的大部分内容,只是不知道如何初始化DllList对象。我想使用延迟加载,因为在最终的系统中,我们有很多选项,每次只使用大约10%。

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

使用Lazy(与T相反)只意味着实例化将被延迟,直到您访问该依赖项为止。如果您正在调试,并且没有看到该依赖项何时被初始化,则需要访问Value属性才能启动实例化

MEF和大多数其他IoC容器之间有一些很大的区别(因为MEF只关注可扩展性/组合),但这与IoC容器在注册类型后在解析某些内容时实例化依赖项的方式类似


如果您想知道如何更改某些实例化行为,这里有一些关于创建策略的详细信息:

首先,您正在尝试将对象导入到静态属性中。MEF不支持此操作:MEF组合对象,而不是类。如果您想初始化静态属性,必须手动执行此操作:

DllList = container.GetExports<IControlModule, IImportComponentCapabilites>();
DllList=container.GetExports();
关于延迟加载:
DirectoryCatalog
为目录中的每个程序集创建一个
AssemblyCatalog
。MEF中的
AssemblyCatalog
实现将在调用
AssemblyCatalog.Parts
后立即枚举程序集中的所有类型,这将在从容器中提取导出时发生。Th是指部件甚至在MEF确定其包含实际需要的零件之前就已加载

为了真正延迟加载程序集,有关这些程序集中哪些零件可用的信息需要缓存在某个位置。MEF目前没有这种现成的内置缓存机制。但是,在随附的示例中有一个
composablepartcatalogsassemblycache
实现


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

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