C#-MEF入门一

MEF就是微软自家的托管可扩展框架,在这里被我用成了ioc容器,其他的功能,不求甚解。

新建一个控制台应用程序项目和一个类库项目,两个项目均引用MEF库。类库项目中新建三个类文件。

复制代码

using System;
using System.ComponentModel.Composition;

namespace Parts
{
    [Export(typeof(object))]//表示此类需要导出,导出的类型为object
    public class TxtFileHandler
    {
       public void Process()
        {
            Console.WriteLine("处理文本文件");
        }
    }
}

 

 其余的就不贴了,只是类名和输出语句不同。

 主程序:

 

using System;
using System.ComponentModel.Composition.Hosting;

namespace meftest
{
    class Program
    {
        //容器,装东西用的。具体装什么先不管。
        private static CompositionContainer container;
        static void Main(string[] args)
        {
            //AssemblyCatalog 目录的一种,表示在程序集中搜索
            var assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);//此处这一句实际上没啥用,因为此程序集下没有任何我们需要的实例(各种handler)
            //在某个目录下的dll中搜索。
            var directoryCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory,"*.dll");
            var aggregateCatalog = new AggregateCatalog(assemblyCatalog, directoryCatalog);

            //创建搜索到的部件,放到容器中。
            container = new CompositionContainer(aggregateCatalog);        
            var exports = container.GetExports<object>();//获得所有导出的部件(object类型的)。
            foreach (var item in exports)
            {
                Console.WriteLine(item.Value);
            }
            Console.ReadLine();
        }
    }
}

 

编译两个项目,将生成的类库文件Parts.dll拷贝到主程序的bin\debug文件夹

  运行主程序:

可以看到,打印出了类名(object.ToString())。我们已经成功的创建了三个类的实例,但主程序并没有引用这个类库。

也可以说,我们将类的实例成功的注入到了主程序。

从这个小例子,我们可以学到,使用MEF三步骤:1、导出所需的类型(部件),2、在合适的目录(AssemblyCatalog、DirectoryCatalog)中查找。3、将找到的部件加入到容器。

之后你就可以使用容器中的已经New好的实例了。

注意:

在TxtFileHandler这个类上面的标记[Export(typeof(object))],表示此类需要导出,而且导出的类型为object

在main函数中,var exports = container.GetExports<object>();//获得所有导出的部件(object类型的)。

导出的类型和要获得的类型必须一致,这种一致性被称作为契约。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值