C# MEF导入没有任何内容
我想使用mef添加插件。在插件中,主程序是否添加了从其他插件导入的内容,如ioc 现在我可以成功地得到这个插件,但在插件中无法得到导入的一个 下面是我的代码。登录插件。服务为空 接口项目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
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
来填写所有导入,我得到了