MEF导入什么都没有

MEF Import has Nothing

我想用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 项目

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中的登录为空(可参见'todo:')。如何获取日志项?

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

当您让 MEF 创建您的服务时,它将在日志 属性 上选取。所以:

    [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; }
    }

如果您必须自己创建服务,您可以要求 MEF 通过在 CompositionContainer 上调用 SatisfyImportsOnce 来填写所有导入。