博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MEF: MSDN 杂志上的文章(13) 重新组合 【暂时用不到,以后再看】
阅读量:4614 次
发布时间:2019-06-09

本文共 1471 字,大约阅读时间需要 4 分钟。

允许部件在系统中出现新的匹配导出时自动更新其导入。

 

[Export]

public class ViewFactory
{
    [ImportMany(AllowRecomposition=true)]
    IEnumerable<Lazy<IView, IViewMetadata>> Views { get; set; }

    public IEnumerable<View>GetViews(ViewTypes viewType) {

        return Views.Where(v=>v.Metadata.ViewType.Equals(viewType)).Select(v=>v.Value);
    }
}

触发“重新组合”是在“目录 Catalog” 上。

有2个目录会触发重新组合。DirectoryCatalog 和 AggregateCatalog。

  • DirectoryCatalog :通过调用其 Refresh 方法来重新组合。
  • AggregateCatalog:这是目录的目录。当添加新的目录时,就会重新组合。

 

void App_Startup(object sender, StartupEventArgs e){    var catalog = new AggregateCatalog();    catalog.Catalogs.Add(newDirectoryCatalog((@"\.")));    var container = new CompositionContainer(catalog);    container.Composeparts(this);    base.MainWindow = MainWindow;    this.DownloadAssemblies(catalog);}private void DownloadAssemblies(AggregateCatalog catalog){    //asynchronously downloads assemblies and calls AddAssemblies}private void AddAssemblies(Assembly[] assemblies, AggregateCatalog catalog){    var assemblyCatalogs = new AggregateCatalog();    foreach(Assembly assembly in assemblies)        assemblyCatalogs.Catalogs.Add(new AssemblyCatalog(assembly));    catalog.Catalogs.Add(assemblyCatalogs); //这行代码在foreach只外,是为了一次性完成重新组合
}
进行重新组合时,集合会立即更新。
结果因集合属性类型而异。
 
  • 如果属性类型是 IEnumerable<T>,则它将替换为新实例。
  • 如果它是继承自 List<T> 或 ICollection 的具体集合,则 MEF 将对每一项依次调用 Clear 和 Add。

无论是哪一种情况,都意味着在使用重新组合时必须考虑线程安全。

重新组合不仅与添加有关,也与删除有关。如果从容器中移除目录,则也会移除这些部件。

 

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

你可能感兴趣的文章
vue+element-ui实现表格checkbox单选
查看>>
box-shadow
查看>>
select * 和select 1 以及 select count(*) 和select count(1)的区别
查看>>
进度条04
查看>>
Silverlight RadGridView的HeaderCellStyle样式
查看>>
IE兼容CSS3圆角border-radius的方法
查看>>
Elsevier期刊投稿状态
查看>>
Heartbeat+LVS构建高可用负载均衡集群
查看>>
多表查询
查看>>
springMVC_数据的处理过程
查看>>
ORM + Mysql配置
查看>>
18 python 初学(time、random 模块)
查看>>
那些年我们扔过的漂流瓶
查看>>
javascript:巧用eval函数组装表单输入项为json对象
查看>>
2.grep、awk、sed、cut处理文本
查看>>
为什么我们叫雪狼队
查看>>
wpf button变成圆角
查看>>
测试开发学习进阶教程 视频&PDF
查看>>
C#基础-连接Access与SQL Server
查看>>
autofac
查看>>