声小白

导航

关于MEF框架 嵌套的用法

  最近才开始使用MEF框架在实际项目中应用,系本人菜鸟,在项目中遇到 部件的嵌套问题,目前的解决方式如下,已备查阅。

  项目结构如下:

  1.MEF接口,分为IStringManager1和IStringManager2

using System.ComponentModel.Composition;

namespace Test.API
{
    [InheritedExport]
    public interface IStringManager1
    {
        string GetString();
    }

    [InheritedExport]
    public interface IStringManager2
    {
        string SetString();
    }

}

  2.IStringManager1的部件

namespace Test.Mef1
{
    public class ClassA:Test.API.IStringManager1
    {

        public string GetString()
        {
            return "test1";
        }
    }
}

  3.IStringManager2的部件

 

using System.ComponentModel.Composition;
using Test.API;

namespace Test.Mef2
{
    public class ClassB :  IStringManager2
    {

        [Import]
        IStringManager1 server1 { get; set; }

        public ClassB()
        {  
            //var catelog = new DirectoryCatalog("lib1");
            //var container = new CompositionContainer(catelog);
            //container.ComposeParts(this);
        }
        public string SetString()
        {
            return server1.GetString();
        }
    }
}

   4.在主调用程序中,仅导入部件2

    [Import]
        Test.API.IStringManager2 ser2 { get; set; }    

    但部件2又导入了部件1,为了让2个程序的实例均在主程序中被实例化,需要在主程序中分别进行组合,否则会出现未实例化部件的异常。主程序完整代码如下:    

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

namespace Test.Mef
{
    class Program
    {

        [Import]
        Test.API.IStringManager2 ser2 { get; set; }
        static void Main(string[] args)
        {
            try
            {
                Program p = new Program();
                var catelog = new AggregateCatalog();
                catelog.Catalogs.Add(new DirectoryCatalog("lib1"));
                catelog.Catalogs.Add(new DirectoryCatalog("lib2")); 
                var container = new CompositionContainer(catelog);
                container.ComposeParts(p);

                Console.WriteLine(p.ser2.SetString());

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);

            }
            finally
            {
                Console.Read();
            }
        }
    }
}

 

posted on 2012-12-20 13:47  声小白  阅读(272)  评论(0)    收藏  举报