C# 延迟加载DLL';她和MEF在一起
我正在用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,
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
非常相似。我希望这对任何人都有帮助