我有两个简单的类:
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相当新,所以任何帮助都会受到赞赏。
答案 0 :(得分:1)
我认为最简单的解决方案是在[Export]
上添加Foo
属性。然后你可以直接得到Foo
:
[Export]
internal class Foo { ... }
...
var foo = container.GetExportedValue<Foo>();