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来说还是个新手,如果有任何帮助,我将不胜感激。
我认为最简单的解决方案是将[Export]
属性放在Foo
上。然后你可以直接得到Foo
:
[Export]
internal class Foo { ... }
...
var foo = container.GetExportedValue<Foo>();