打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C Sharp与.net学习笔记(四)

接前面MAF,看看MEF插件框架(它是.NET4的组成部分,所以装个Visual C#2010 express)

和 MAF 比起来,这个易用性太高了。只需要定义一个接口,然后Import、Export、Compose就行了...

例子

动手试两个简单的例子:

  • 定义接口 interface.cs

public interface IOperation{    int Operate(int left, int right);}
  • 使用接口 program.cs
    • Import
    • Compose

using System;using System.ComponentModel.Composition;using System.ComponentModel.Composition.Hosting;class Program{    [Import(typeof(IOperation))]    public IOperation op;    private CompositionContainer container;    private Program()    {        var catalog = new AggregateCatalog();        catalog.Catalogs.Add(new DirectoryCatalog("."));        container = new CompositionContainer(catalog);        container.ComposeParts(this);    }    static void Main(string[] args)    {        Program p = new Program();        Console.Write("Input two number.\n%> ");        string line = Console.ReadLine();        while (line != "q") {            string[] nums = line.Split(' ');            try {                int res = p.op.Operate(int.Parse(nums[0]), int.Parse(nums[1]));                Console.Write("{0}\n%> ", res.ToString());            } catch {                Console.Write("Error!\n%> ");            }            line = Console.ReadLine();        }    }}
  • 实现接口 add.cs
    • Export

using System.ComponentModel.Composition;[Export(typeof(IOperation))]class Add : IOperation{    public int Operate(int left, int right)    {        return left + right;    }}

编译:

E:\Test> csc /target:library interface.csE:\Test> csc /r:System.ComponentModel.Composition.dll;interface.dll program.csE:\Test> csc /r:System.ComponentModel.Composition.dll;interface.dll add.cs

例子二

前面的例子使用Import只能导入一个插件(对应一个Export),如果有多个Export,则运行时会抛出异常。

如果需要导入多个,使用 ImportMany,此时,定义一个额外的接口保存插件接口相关参数

  • interface.cs

public interface IOperation{    int Operate(int left, int right);}public interface IOperationID{    char ID { get;}}
  • program.cs

using System;using System.Collections.Generic;using System.ComponentModel.Composition;using System.ComponentModel.Composition.Hosting;class Program{    [ImportMany]    IEnumerable<Lazy<IOperation, IOperationID>> operations;    private CompositionContainer container;    private Program()    {        var catalog = new AggregateCatalog();        //catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));        catalog.Catalogs.Add(new DirectoryCatalog("."));        container = new CompositionContainer(catalog);        container.ComposeParts(this);    }    static void Main(string[] args)    {        Program p = new Program();        foreach (Lazy<IOperation, IOperationID> i in p.operations)        {            Console.WriteLine("{0} {1}", i.Metadata.ID, i.Value.Operate(886, 2).ToString());        }    }}
  • 然后就可以同目录下放置一堆插件了

[Export(typeof(IOperation))][ExportMetadata("ID", '+')]class Add : IOperation{    public int Operate(int left, int right)    {        return left + right;    }}[Export(typeof(IOperation))][ExportMetadata("ID", '-')]class Subtract : IOperation{    public int Operate(int left, int right)    {        return left - right;    }}...

这些Export非常灵活,可以在当前的dll内,也可以在exe内,...

运行结果:

E:\Test> program.exe + 888 - 884 / 443 * 1772

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
MEF 打造的插件系统
MEF程序设计指南一:在应用程序中宿主MEF
中间层组件(1)
C#进阶系列——MEF实现设计上的“松耦合”(一)
C#中的枚举(Enum)你知道多少呢?
ArrayList的使用方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服