MEF导入空值

4
首先:你们都很棒,我经常在这个网站上寻找MEF答案。
我的问题如下:
我有几个包含许多[Imports]的程序集和一个主应用程序,在那里进行组装。现在的问题是,这些导入项没有被“填充”,它们始终保持为空。
我已经尝试在一个简单的小项目中重现这种行为,并得出了以下源代码。
我是否对MEF有所误解?
请帮忙!谢谢大家!
接口程序集:
namespace Interfaces
{
    public interface IClass1
    {
        void Trigger();
    }

    public interface IClass2
    {
        void Trigger();
    }

    public interface IClass3
    {
        void Trigger();
    }
}

汇编语言库1:

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

        #region IClass1 Members

        public void Trigger()
        {

        }

        #endregion
    }
}

汇编库2:

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]没有得到满足?我想我完全错过了什么...
提前感谢大家的帮助!
Michael
1个回答

3
只要 class3 没有通过 MEF 实例化,你就看不到任何导入。顺便说一句,如果你不是通过 [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();
    }
}

啊,好的 - 否则我就得使用SatisfyImportsOnce了,对吧? - Michael
为什么不将class3声明为导出项,让MEF创建class3实例呢?如果您不想在class3中使用CompositionContainer实例,那么这可能不是您想要的。 - blindmeis
好的 - 那我怎么获取class3实例呢? - Michael
在组合方面,MEF 应该自动地将它注入到 private IClass3 my3; 中。 - Jake Berger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接