我正在使用MEF开发一些示例程序。在我写的最简单的例子中,我有一个IDoSomething
接口,看起来像这样:
public interface IDoSomething
{
void DoIt();
}
和一个实现它的类,如下所示:
[Export(typeof(IDoSomething))]
public class TestClass : IDoSomething
{
public void DoIt()
{
Console.WriteLine("TestClass::DoIt");
}
}
和一个加载插件的类,如下所示:
public class PluginManager
{
[ImportMany(typeof(IDoSomething))]
private IEnumerable<IDoSomething> plugins;
public void Run()
{
Compose();
foreach (var plugin in plugins)
{
plugin.DoSomething();
}
}
private void Compose()
{
var catalog = new DirectoryCatalog(@".\");
var compositionContainer = new CompositionContainer(catalog);
compositionContainer.ComposeParts(this);
}
}
这似乎有效,但现在我想做的是扩展我的具体插件本身有一个插件,如下所示:
[Export(typeof(IDoSomething))]
public class TestClass2 : IDoSomething
{
[Import(typeof(IDoAnotherThing))]
public IDoAnotherThing Plugin { get; set; }
public void DoIt()
{
Console.WriteLine("TestClass2::DoIt");
Plugin.Func();
}
}
IDoAnotherThing
看起来像这样:
public interface IDoAnotherThing
{
void Func();
}
我的具体实现如下:
[Export(typeof(IDoAnotherThing))]
public class AnotherPlugin: IDoAnotherThing
{
public void Func()
{
Console.WriteLine("AnotherPlugin::Func");
}
}
我运行时看到的行为是我的TestClass2
实例被创建并调用了它的DoIt
函数,但它的AnotherPlugin
实例永远不会被调用。我看到目录中列出了AnotherPlugin
。我在这做错了什么?
答案 0 :(得分:0)
我认为正确地指明了这一点,事实证明我是,但正如Matthew Abbott在上面评论的那样,其他事实上正在发生。在这种情况下,事实是我的具体类插件并非都在同一目录中结束,因此,我的应用程序没有发现正确的。活到老,学到老。一旦我确定我拥有最新的所有组件,一切都运转正常。