【问题标题】:unexpected result in mefmef的意外结果
【发布时间】:2011-06-30 17:28:52
【问题描述】:

我是 MEF 的初学者。我写了这段代码,但我不明白为什么程序会显示这个结果。

namespace ConsoleApplication1
{
    public class MEFTest
    {
         [Import]
        public string Text { get; set; }

        [Import]
        public IExtension Ext { get; set; }

        public void ShowText()
        {
            AssemblyCatalog asscatalog = new AssemblyCatalog(typeof(Extension2).Assembly);
            CompositionContainer container = new CompositionContainer(asscatalog);

            CompositionBatch batch = new CompositionBatch();
            batch.AddPart(this);

            container.Compose(batch);

            Console.WriteLine(Text);
            Console.WriteLine(Ext.Text);
        }
    }
    class Program
    {
        static void Main( string[] args )
        {
            MEFTest mef = new MEFTest();

            mef.ShowText();

            Console.ReadKey();
        }
    }

    public interface IExtension
    {
        string Text { get; set; }
    }

    [Export]
    public class Extension1 : IExtension
    {
        [Export]
        public string Text { get; set; }

        public Extension1()
        {
            Text = "From Extension1.";
        }
    }

    [Export(typeof(IExtension))]
    public class Extension2 : IExtension
    {
       // [Export(typeof(IExtension).GetProperties()[0].GetType())]
        public string Text { get; set; }

        public Extension2()
        {
            Text = "From Extension2.";
        }
    }
} 

结果:

从扩展 1。 来自 Extension2。

【问题讨论】:

  • 是你的结果Form Extenstion1。表单扩展2?
  • Hazai,如下 Reed 所说,你必须删除 [Import] public string Text {get;set;} 你不需要这个。

标签: c# .net c#-4.0 mef


【解决方案1】:

这正是 MEF 匹配您的导入的方式。既然你有:

    [Import]
    public string Text { get; set; }

在这种情况下,MEF 找到一个“字符串文本”并进行匹配。这发生在 Extention1 中,但只是因为您明确向其 Text 属性添加了导出。

    [Import]
    public IExtension Ext { get; set; }

这会找到IExtension 类型的实际Export。其中唯一的一个是您的Extension2 课程。这满足了这个要求。

【讨论】:

  • 我想他是说表单扩展 1 和表单扩展 2 都在显示。
  • @Jethro:是的,但他有 2 个单独的导入,并且都在打印。正如我上面所说,第一个导入找到 Extension1,第二个找到 Extension2。
  • 我明白了,所以如果匹配 Extension1 Text 属性,则会发生导入。谢谢。
  • @Jethro:是的。如果您也从 Extension2 中导出 Text 属性,则会出现异常,因为将有超过 1 个匹配的导入...
【解决方案2】:

Extension1 声明它导出自己(Extension1 类型,而不是接口)并导出一个名为 Text 的字符串类型的属性。

在合成中,这将绑定到标记为导入的 Text 属性。

Extension2 声明它导出类型 IExtension。这将绑定到标记为导入 IExtension 的 Ext 属性。

【讨论】:

    猜你喜欢
    • 2011-09-15
    • 2012-04-02
    • 2019-05-14
    • 2017-07-11
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多