mef 中出现意外结果

发布于 2024-11-18 02:00:25 字数 1515 浏览 1 评论 0原文

我是 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.";
        }
    }
} 

结果:

来自 Extension1。 来自扩展2。

i am beginner in MEF. i write this code but i cant understand why program show this result.

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.";
        }
    }
} 

result :

From Extension1.
From Extension2.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

魂牵梦绕锁你心扉 2024-11-25 02:00:25

这就是 MEF 匹配您的导入的方式。因为您已经:

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

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

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

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

This is just how MEF is matching your imports. Since you have:

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

In this case, MEF finds a "string Text" and does the match. This happens from Extention1, but only because you explicitly added an export to its Text property.

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

This finds the actual Export of type IExtension. The only one of these is your Extension2 class. This fulfills this requirement.

帅冕 2024-11-25 02:00:25

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

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

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

Extension1 declares that it exports itself (type Extension1, not the interface) and exports a property named Text of type string.

In composition, this will be bound to the Text property tagged as import.

Extension2 declares that it exports type IExtension. This will be bound to the Ext property tagged to import IExtension.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文