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

本文介绍了System.Lazy<T>及Lazy<T,TMetadata>的概念,解释了如何利用它们实现延迟实例化,并通过一个具体示例展示了如何在MEF中使用这些特性来获取带有元数据的导出。

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 属性, 会生成部件的实例
  }
}

 

 

转载于:https://www.cnblogs.com/Ken-Cai/archive/2012/06/22/2558388.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值