我正在用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%.
首先,您尝试将对象导入静态属性.MEF不支持这一点:MEF组成对象,而不是类.如果要初始化静态属性,则必须手动执行此操作:
DllList = container.GetExports<IControlModule, IImportComponentCapabilites>();
Run Code Online (Sandbox Code Playgroud)
现在关于延迟加载:为目录中的每个程序集DirectoryCatalog创建一个AssemblyCatalog.AssemblyCatalogMEF中的实现将在AssemblyCatalog.Parts调用时立即枚举程序集中的所有类型,这将在您从容器中提取导出时发生.这意味着即使在MEF确定它包含实际需要的部件之前,也会加载该组件.
为了真正延迟加载程序集,需要在某处缓存有关哪些部件在这些程序集中可用的信息.MEF目前没有开箱即用的内置缓存机制.但是,在codeplex中ComposablePartCatalogAssemblyCache的MEF源代码中包含的样本中有一个实现.
唯一Lazy<T>能做的就是推迟调用零件构造函数的那一刻.这可以加快速度,但不会推迟加载程序集.
| 归档时间: |
|
| 查看次数: |
4831 次 |
| 最近记录: |