MEF和导入构造函数而不事先知道导入

时间:2014-06-26 23:28:59

标签: c# mef

我有两个简单的类:

using System.ComponentModel.Composition;

namespace MefTest
{        
    internal class Foo
    {
        [ImportingConstructor]
        public Foo(IBar bar)
        {
        }
    }

    internal interface IBar
    {
        void DoStuff();
    }

    [Export(typeof(IBar))]
    internal class Bar : IBar
    {
        public void DoStuff()
        {
        }
    }
}

如何在不知道它需要Bar作为导入的情况下创建Foo类。我知道我可以这样做:

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

namespace MefTest
{
    internal class Program
    {
        public static void Main()
        {
            var catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
            var container = new CompositionContainer(catalog);

            //This requires I know the imports, is there a way to do it without that knowledge beforehand?
            var bar = container.GetExportedValue<IBar>();
            var foo = new Foo(bar);
        }
    }
}

但我正在寻找一种方法来调用Foo而不知道它需要Bar,让MEF为我解决这个问题。这是可能的,还是我总是需要像上面的例子一样提前知道导入?

MEF相当新,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

我认为最简单的解决方案是在[Export]上添加Foo属性。然后你可以直接得到Foo

[Export]
internal class Foo { ... }

...

var foo = container.GetExportedValue<Foo>();