MEF导入无效

时间:2017-07-17 09:04:06

标签: c# .net mef

我想用mef添加插件。在插件中,有一些从主程序添加的其他插件导入的东西,就像ioc一样?

现在我可以成功获得此插件,但在插件中无法获取导入的插件。

以下是我的代码。登录plugin.Service为空。

接口项目

Ilog.cs

public interface Ilog
{
    void Log(string log);
}

IServece.cs

public interface IService
{
    Ilog Log { get; }

    void DoSomeThing();
}

IPlugin.cs

public interface IPlugin
{
    string PluginName { get; }

    IService Service { get; }
}

Plugin1 Project

public class Plugin1Service : IService
{
    [Import(typeof(Ilog))]
    public Ilog Log { get; private set; }//todo:Log is null

    public void DoSomeThing()
    {
        Log.Log("test from Plugin1");
    }
}

[Export(typeof(IPlugin))]
public class Plugin1Info : IPlugin
{
    public string PluginName => "Plugin1";

    public IService Service =>new Plugin1Service();
}

ConsoleLog项目

[Export(typeof(Ilog))]
public class Console1 : Ilog
{
    public void Log(string log)
    {
        Console.WriteLine(log);
    }
}

主要项目

class Program
{
    static void Main(string[] args)
    {
        var catalogs = new DirectoryCatalog(Directory.GetCurrentDirectory());
        var container = new CompositionContainer(catalogs);

        var plugin = container.GetExportedValue<IPlugin>();
        Console.WriteLine($"{plugin.PluginName}");
        plugin.Service.DoSomeThing();

        Console.ReadKey(true);
    }
}

运行程序时,plugin.Service中的日志为null (可以看到'todo:')。如何获取日志项?

1 个答案:

答案 0 :(得分:1)

您创建自己的服务实例,因此MEF不提供ILog实例。

当您让MEF创建您的服务时,它将获取Log属性。所以:

    [Export(typeof(IService))] // Add this export
    public class Plugin1Service : IService
    {
        [Import(typeof(Ilog))]
        public Ilog Log { get; private set; }//todo:Log is null

        public void DoSomeThing()
        {
            Log.Log("test from Plugin1");
        }
    }

    [Export(typeof(IPlugin))]
    public class Plugin1Info : IPlugin
    {
        public string PluginName => "Plugin1";

        [Import] // Import the service
        public IService Service { get; set; }
    }

如果您必须自己创建服务,可以通过致电SatisfyImportsOnce上的CompositionContainer让MEF填写所有导入。