我想用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:')。如何获取日志项?
答案 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填写所有导入。