MEF宿主应用程序

在应用程序中宿主MEF

 

Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,他的特点如下:

  1、.net下的一个可扩展行管理框架,包括了依赖注入和Duck Typing。
  2、 轻松应对应用程序扩展并且对已有代码产生最小影响。
  3、 应用程序和扩展程序之间不产生直接依赖,多个同样需求共享扩展程序。

 

参照http://mef.codeplex.com上面的教程尝试实现了一个示例

实现的步骤如下:
1、创建一个wpf的Console Application,宿主就是Program class
2、添加System.ComponentModel.Composition程序集和相关引用
3、添加一个Compone()方法,创建组合容器
4、添加一个方法,调用Compone()方法
5、在Main方法里实例化宿主
6、定义在宿主中导出的部件
7、在宿主中导出部件
8、添加部件到容器,方法有二
   1.直接添加组合部件实例
   2.使用目录添加组合部件

 

实现代码:

using System;

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

namespace MEFConsole
{
    /// <summary>
    /// 宿主
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();

            p.Run1();
            p.Run2();
        }

        /// <summary>
        /// 导入
        /// </summary>
        [Import]
        public IWaiter waiter { get; set; }

        /// <summary>
        /// 实例化组合容器
        /// 直接添加部件
        /// </summary>
        private void Compone1()
        {
            var container = new CompositionContainer();
            container.ComposeParts(this, new Waiter());
        }

        /// <summary>
        /// 测试直接添加部件方法
        /// </summary>
        public void Run1()
        {
            Console.WriteLine("直接添加部件到容器方式:");
            Compone1();
            waiter.Welcome();
            waiter.Serve("糖醋里脊");
            waiter.GoodBye();
            Console.WriteLine();
            //Console.Read();
        }

        /// <summary>
        /// 实例化组合容器类
        /// 通过目录添加部件
        /// </summary>
        private void Compone2()
        {
            var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
            var container2 = new CompositionContainer(catalog);
            container2.ComposeParts(this);
        }

        /// <summary>
        /// 测试通过目录添加控件
        /// </summary>
        public void Run2()
        {
            Console.WriteLine("通过目录添加部件到容器方式:");
            Compone2();
            waiter.Welcome();
            waiter.Serve("糖醋里脊");
            waiter.GoodBye();
            Console.Read();
        }
    }

    /// <summary>
    /// 声明服务员接口
    /// </summary>
    public interface IWaiter
    {
        void Welcome();

        void Serve(string name);

        void GoodBye();
    }

    /// <summary>
    /// 服务员类
    /// 标记为导出
    /// </summary>
    [Export(typeof(IWaiter))]
    public class Waiter : IWaiter
    {
        public void Welcome()
        {
            Console.WriteLine("欢迎光临!");
        }

        public void Serve(string name)
        {
            Console.WriteLine("先生您点的菜" + name + "来了,请慢用!");
        }

        public void GoodBye()
        {
            Console.WriteLine("欢迎下次光临!");
        }
    }


}

执行结果:
posted @ 2010-11-09 22:47  星空有我  阅读(642)  评论(0编辑  收藏  举报