前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于MEF

关于MEF

作者头像
Jerremy
发布2022-05-09 14:52:25
3870
发布2022-05-09 14:52:25
举报
文章被收录于专栏:Puppeteer学习

MEF(Managed Extensibility Framework)是.NET Framework 4.0一个重要的库,Visual Studio 2010 Code Editor的扩展支持也是基于MEF构建的。

MEF组合过程

1.创建组件目录(如AssemblyCatalog)

2.创建组合容器CompositionContainer

3.创建一个组件

4.从组件容器获取其它组件功能定义,执行匹配组合

代码语言:javascript
复制
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); //创建一个程序集目录,用于从一个程序集获取所有的组件定义   
var container = new CompositionContainer(catalog); //创建组合容器   
var composablePart = new MyComponent();   
container.ComposeParts(composablePart); //=获取ExportDefinition并创建实例组合在一起 

上面代码有一个问题,如果程序集过大,会导致速度很慢,毕竟会搜索程序集,所以可以改为下面这种方式来实现:

下面基于一个具体事例:

代码语言:javascript
复制
TypeCatalog cat = new TypeCatalog(typeof(IRepository<T_JSSDD_DDZB_SXPZ>),
                typeof(IRepository<T_JSSDD_DDZB_SBXM>),
                typeof(IRepository<T_JSSDD_DDZB_SXPZVALUE>), typeof(IRepository<T_JSSDD_DDZB_XM_R_SX>));
            //如果程序集比较小的话,可以使用AssemblyCatalog来初始化组合容器,程序集如果比较大,那么由于反射查找整个程序集
            //所以性能上很差,建议使用上面TypeCatalog来初始化组合容器
            AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
            var container = new CompositionContainer(cat);
            container.ComposeParts(this,
                new T_JSSDD_DDZB_SBXMRepository(),
                new T_JSSDD_DDZB_SXPZRepository(),
                new T_JSSDD_DDZB_XM_R_SXRepository(),
                new T_JSSDD_DDZB_SXPZVALUERepository()
                );

直接传入接口和类进行映射和其他IOC容器用法类似,速度会快很多,缺点就是灵活性少了。

贴点简单事例代码吧,看下用法,具体的机制大家慢慢研究吧,MEF基于net framework 4.0,不用引入第三方类库,使用也是挺方便的:

代码语言:javascript
复制
/// <summary>
    /// 导出特性
    /// </summary>
    [Export(typeof(ICal1))]
    public class Class1 : ICal1
    {
        public void C()
        {
            Console.WriteLine("实现二");
        }
    }

/// <summary>
    /// 导出特性
    /// </summary>
    [Export(typeof(ICalculator))]
    public class MySimpleCalculator : ICalculator
    {
        public string Calculate(string input)
        {
            Console.WriteLine("已经实现的方法");
            return null;
        }
    }


 public class Container
    {
        /// <summary>
        /// 导入
        /// </summary>
        [Import(typeof(ICalculator))]
        public ICalculator ICalculator { get; set; }
        /// <summary>
        /// 导入特性
        /// </summary>
        [Import(typeof(ICal1))]
        public ICal1 ICal1 { get; set; }

        //初始化容器
        public Container()
        {
            AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this,new MySimpleCalculator(), new Class1());
        }


    }

      static void Main(string[] args)
        {
            Container container = new Container();
            Console.WriteLine("Enter Command:");
            container.ICal1.C();
            Console.WriteLine(container.ICalculator.Calculate(""));
            Console.Read();
        }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档