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