标签:
public class FilteredCatalog : ComposablePartCatalog, INotifyComposablePartCatalogChanged
{
#region Private Fields
private readonly ComposablePartCatalog m_ComposablePartCatalog;
private readonly INotifyComposablePartCatalogChanged m_NotifyComposablePartCatalogChanged;
private readonly IQueryable<ComposablePartDefinition> m_Parts;
#endregion
#region Constructors
/// <summary>
/// 默认构造函数。
/// </summary>
/// <param name="composablePartCatalog">包含了所有导出部件的目录Catalog。</param>
/// <param name="expression">筛选条件表达式。</param>
public FilteredCatalog(ComposablePartCatalog composablePartCatalog, Expression<Func<ComposablePartDefinition, bool>> expression)
{
m_ComposablePartCatalog = composablePartCatalog;
m_NotifyComposablePartCatalogChanged = composablePartCatalog as INotifyComposablePartCatalogChanged;
m_Parts = composablePartCatalog.Parts.Where(expression);
}
#endregion
#region INotifyComposablePartCatalogChanged
/// <summary>
/// 部件目录Catalog已经改变后触发的事件。
/// </summary>
public event EventHandler<ComposablePartCatalogChangeEventArgs> Changed
{
add
{
if (m_NotifyComposablePartCatalogChanged != null)
{
m_NotifyComposablePartCatalogChanged.Changed += value;
}
}
remove
{
if (m_NotifyComposablePartCatalogChanged != null)
{
m_NotifyComposablePartCatalogChanged.Changed -= value;
}
}
}
/// <summary>
/// 部件目录Catalog正在发生改变时触发的事件。
/// </summary>
public event EventHandler<ComposablePartCatalogChangeEventArgs> Changing
{
add
{
if (m_NotifyComposablePartCatalogChanged != null)
{
m_NotifyComposablePartCatalogChanged.Changing += value;
}
}
remove
{
if (m_NotifyComposablePartCatalogChanged != null)
{
m_NotifyComposablePartCatalogChanged.Changing -= value;
}
}
}
#endregion
#region ComposablePartCatalog
/// <summary>
/// 获取目录中包含的部件定义。经过构造函数中的表达式过滤后,已经是传入目录Catalog对象中的一部分导出部件了。
/// </summary>
public override IQueryable<ComposablePartDefinition> Parts
{
get { return m_Parts; }
}
#endregion
}上述代码中概括来说包含如下几点内容:// 获取所需的部件。
DirectoryCatalog catalog = new DirectoryCatalog("controls");
CompositionContainer container = new CompositionContainer(catalog);
// 过滤Catalog,生成子组合容器。
FilteredCatalog filteredCatalog = new FilteredCatalog(catalog,
o=>o.Metadata.ContainsKey("UC") && o.Metadata["UC"].ToString() == "BB");
CompositionContainer filteredContainer = new CompositionContainer(filteredCatalog, container);
UserControl userControl = filteredContainer.GetExportedValue<UserControl>();
this.MainContentControl.Content = userControl;首先通过DirectoryCatalog类获取到应用程序根目录下controls子文件夹中的所有部件定义,并以此生成顶级组合容器container(类型为CompositionContainer)。2、参考了微软MVP Bēniaǒ的文章《MEF程序设计指南七:使用目录(Catalog)动态装载xap与目录筛选(Filtered Catalog)》,访问地址:http://www.cnblogs.com/beniao/archive/2010/07/26/1782622.html
标签:
原文地址:http://blog.csdn.net/gjysk/article/details/45055379