MEF导入null

时间:2012-01-04 09:52:22

标签: c# import mef

首先:你们都很棒,我经常在这个网站上搜索MEF答案。

我的问题如下:

我有几个装配有许多[Imports]的装配和一个装配发生的主要应用程序。现在的问题是,那些Imports没有被“填充”,它们总是保持为空。

我试图在一个简单的小项目中重现这种行为,并提出了以下源代码。

我想知道关于MEF的一些事情吗?

请帮忙!谢谢大家!

装配接口:

namespace Interfaces
{
    public interface IClass1
    {
        void Trigger();
    }

    public interface IClass2
    {
        void Trigger();
    }

    public interface IClass3
    {
        void Trigger();
    }
}

Assembly Library1:

namespace Library1
{
    [Export(typeof(IClass1))]
    public class Class1:IClass1
    {

        #region IClass1 Members

        public void Trigger()
        {

        }

        #endregion
    }
}

Assembly Library2:

namespace Library2
{
    [Export(typeof(IClass2))]
    public class Class2:IClass2
    {
        [Import]
        public IClass1 Class1 { get; set; }

        public void Trigger()
        {
        }
    }
}

在主程序中,我组装完整的Mef内容,执行以下操作:

namespace MEFTest
{
    public class mefStart
    {
        public CompositionContainer Container { get; private set; }

        public void Start()
        {
            AggregateCatalog catalog = new AggregateCatalog();

            AssemblyCatalog assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);
            DirectoryCatalog directoryCatalog = new DirectoryCatalog(".", "Library*.dll");
            catalog.Catalogs.Add(directoryCatalog);
            catalog.Catalogs.Add(assemblyCatalog);

            this.Container = new CompositionContainer(catalog);

            CompositionBatch batch = new CompositionBatch();
            batch.AddExportedValue(this.Container);

            this.Container.Compose(batch);
            this.Container.ComposeParts(this);
        }
    }
}

但是之后,下面的类没有填充任何导入:

namespace MEFTest
{
    public class Class3:IClass3
    {
        [Import]
        public IClass1 Class1 { get; set; }

        [Import]
        public IClass2 Class2 { get; set; }

        public void Trigger()
        {
            Class1.Trigger();
            Class2.Trigger();
        }
    }
}

当我查看容器时,我看到IClass1和ICLass2已经组成。

为什么Class3中的[Import]不满足?我想我完全错过了一些东西......

提前感谢大家的帮助!

迈克尔

1 个答案:

答案 0 :(得分:3)

只要未通过MEF实例化class3,您就不会看到任何导入。

顺便说一句,如果你不是通过[ImportingConstructor]进行导入 - 请确保在使用之前导入满意的(IPartImportsSatisfiedNotification)。

这可行,但我不知道你需要你的class3

public class mefStart
{
    [Import]
    private IClass3 my3;
    public CompositionContainer Container { get; private set; }

    public void Start()
    {
        AggregateCatalog catalog = new AggregateCatalog();

        AssemblyCatalog assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);
        DirectoryCatalog directoryCatalog = new DirectoryCatalog(".", "Library*.dll");
        catalog.Catalogs.Add(directoryCatalog);
        catalog.Catalogs.Add(assemblyCatalog);

        this.Container = new CompositionContainer(catalog);

        CompositionBatch batch = new CompositionBatch();
        batch.AddExportedValue(this.Container);

        this.Container.Compose(batch);
        this.Container.ComposeParts(this);

        //from here you can use Class3 with all imports
    }
}

[Export(typeof(IClass3)]
public class Class3:IClass3
{
    [Import]
    public IClass1 Class1 { get; set; }

    [Import]
    public IClass2 Class2 { get; set; }

    public void Trigger()
    {
        Class1.Trigger();
        Class2.Trigger();
    }
}