如何使用MEF对零件进行分层?

时间:2011-11-18 03:31:39

标签: .net mef

我正在使用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。我在这做错了什么?

1 个答案:

答案 0 :(得分:0)

我认为正确地指明了这一点,事实证明我是,但正如Matthew Abbott在上面评论的那样,其他事实上正在发生。在这种情况下,事实是我的具体类插件并非都在同一目录中结束,因此,我的应用程序没有发现正确的。活到老,学到老。一旦我确定我拥有最新的所有组件,一切都运转正常。