C# MEF导入没有任何内容

C# MEF导入没有任何内容,c#,.net,mef,C#,.net,Mef,我想使用mef添加插件。在插件中,主程序是否添加了从其他插件导入的内容,如ioc 现在我可以成功地得到这个插件,但在插件中无法得到导入的一个 下面是我的代码。登录插件。服务为空 接口项目 public class Plugin1Service : IService { [Import(typeof(Ilog))] public Ilog Log { get; private set; }//todo:Log is null public void DoSomeThing

我想使用mef添加插件。在插件中,主程序是否添加了从其他插件导入的内容,如ioc

现在我可以成功地得到这个插件,但在插件中无法得到导入的一个

下面是我的代码。登录插件。服务为空

接口项目

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();
}
[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);
    }
}
Ilog.cs

IServece.cs

IPlugin.cs

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();
}
[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);
    }
}
ConsoleLog项目

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();
}
[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);
    }
}
主要项目

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();
}
[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);
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var catalogs=newdirectorycatalog(Directory.GetCurrentDirectory());
var容器=新的合成容器(目录);
var plugin=container.GetExportedValue();
Console.WriteLine($“{plugin.PluginName}”);
plugin.Service.DoSomeThing();
Console.ReadKey(true);
}
}

运行该程序时,登录plugin.Service为null(可以查看“todo:”)。如何获取日志项?

您创建了自己的服务实例,因此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; }
    }

如果您必须自己创建服务,您可以要求MEF通过调用
CompositionContainer

Tanks to@Pidon上的
SatisfyImportsOnce
来填写所有导入,我得到了