MEF: MSDN 杂志上的文章(12) 导入延迟导出和访问元数据

http://msdn.microsoft.com/zh-cn/magazine/ee291628.aspx

System.Lazy<T>: 可延迟实例的实例化,直至访问 Lazy 的 Value 属性.

Lazy<T,TMetadata> : 允许在不实例化基础导出的情况下访问导出元数据。

TMetadata 是元数据视图类型。

元数据视图是接口,用于定义对应于所导出元数据中的键的只读属性。

访问元数据属性时,MEF 将动态实现 TMetadata,且将基于导出提供的元数据来设置值。

[Export]
public class ViewFactory
{
  [ImportMany]
  IEnumerable<Lazy<IView, IViewMetadata>> Views { get; set; }
}
public interface IViewMetadata
{
  ViewTypes ViewType {get;}
}

 导入了包含元数据的延迟导出集合后,可使用 LINQ 对该集合进行筛选。

[Export]
public class ViewFactory
{
  [ImportMany]
  IEnumerable<Lazy<IView, IViewMetadata>> Views { get; set; }

  public IEnumerable<IView> GetViews(ViewTypes viewType) {
    return Views.Where(v=>v.Metadata.ViewType.Equals(viewType)).Select(v=>v.Value); 
    //请注意,它会访问 Value 属性, 会生成部件的实例
  }
}

 

 

posted @ 2012-06-22 00:40  Ken-Cai  阅读(299)  评论(0编辑  收藏  举报