注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[.NET4] Hello MEL(Managed Extensibility Framework)  

2012-01-13 15:27:58|  分类: lang_C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

MEL 可以在运行期组装模块,让实现 Plugin 这样的东东很容易,且标准化了。

MEL 位于 System.ComponentModel.Composition.dll。

Export, ExportMetadata 要在 System.ComponentModel.Composition 中。


MEL 是开源的

http://mef.codeplex.com/

MEL Programming Guide

http://mef.codeplex.com/wikipage?title=Guide&referringTitle=Home

《MEF程序设计指南》博文汇总

http://www.cnblogs.com/beniao/archive/2010/08/11/1797537.html


------------------------- Program.cs --------------------------------

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ComponentModel.Composition;

using System.ComponentModel.Composition.Hosting;


namespace SimpleCalc

{

    public interface ICalculator

    {

        String Calculate(String input);

    }


    public interface IOperation

    {

        int Operate(int left, int right);

    }


    public interface IOperationData

    {

        Char Symbol { get; }

    }


    [Export(typeof(IOperation))]

    [ExportMetadata("Symbol", '+')]

    class Add : IOperation

    {

        public int Operate(int left, int right)

        {

            return left + right;

        }

    }


    [Export(typeof(IOperation))]

    [ExportMetadata("Symbol", '-')]

    class Subtract : IOperation

    {

        public int Operate(int left, int right)

        {

            return left - right;

        }

    }


    [Export(typeof(ICalculator))]    

    class MySimpleCalculator : ICalculator

    {

        [ImportMany]

        IEnumerable<Lazy<IOperation, IOperationData>> operations;


        public String Calculate(String input)

        {

            int left;

            int right;

            Char operation;

            int fn = FindFirstNonDigit(input);

            if (fn < 0)

                return "Could not parse command.";


            try

            {

                left  = int.Parse(input.Substring(0, fn));

                right = int.Parse(input.Substring(fn+1));

            }

            catch

            {

                return "Cound not parse command2.";

            }


            operation = input[fn];

            foreach (Lazy<IOperation, IOperationData> i in operations)

            {

                if (i.Metadata.Symbol.Equals(operation))

                    return i.Value.Operate(left, right).ToString();

            }


            return "Operation Not Found!";

        }


        private int FindFirstNonDigit(String s)

        {

            for (int i = 0; i < s.Length; i++)

            {

                if (!Char.IsDigit(s[i]))

                    return i;

            }


            return -1;

        }

    }


    class Program

    {

        private CompositionContainer container;


        [Import(typeof(ICalculator))]

        public ICalculator calculator;


        private Program()

        {

            var catalog = new AggregateCatalog();

            catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));

            catalog.Catalogs.Add(new DirectoryCatalog(Environment.CurrentDirectory, "*.dll"));


            this.container = new CompositionContainer(catalog);


            try

            {

                this.container.ComposeParts(this);

            }

            catch (CompositionException e)

            {

                Console.WriteLine(e.ToString());    

            }

        }


        static void Main(string[] args)

        {

            Program p = new Program();

            String s;

            Console.WriteLine("Enter Command:");

            while (true)

            {

                s = Console.ReadLine();

                Console.WriteLine(p.calculator.Calculate(s));

            }

        }

    }

}

--------------------------- ExtendedOperations.cs -------------------------------

using System;

using System.ComponentModel.Composition;


namespace ExtendedOperations

{

    [Export(typeof(SimpleCalc.IOperation))]

    [ExportMetadata("Symbol", '%')]

    public class Mod : SimpleCalc.IOperation

    {

        public int Operate(int left, int right)

        {

            return left % right;

        }

    }

}

---------------------------------------------------------------------

> dmcs /r:System.ComponentModel.Composition.dll Program.cs

> dmcs /r:System.ComponentModel.Composition.dll /r:Program.exe /t:library ExtendedOperations.cs

> mono Program.exe



  评论这张
 
阅读(1042)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017