MEF和在事先不知道导入的情况下导入构造函数

本文关键字:导入 情况下 构造函数 不知道 MEF | 更新日期: 2023-09-27 18:10:24

我有两个简单的类:

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()
        {
        }
    }
}

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

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来说还是个新手,如果有任何帮助,我将不胜感激。

MEF和在事先不知道导入的情况下导入构造函数

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

[Export]
internal class Foo { ... }
...
var foo = container.GetExportedValue<Foo>();