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
来填写所有导入。
我想用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
来填写所有导入。