我正在开发一个可以与各种硬件进行通信的程序。由于它通信和控制的项目具有不同的性质,我需要为每个不同的硬件配备不同的“驱动程序”。这让我认为 MEF 是一种将这些驱动程序制作为插件的好方法,即使在产品发布后也可以添加这些插件。
我已经看过很多如何使用 MEF 的示例,但我无法找到答案的问题是如何使用外部数据(例如来自数据库)填充 MEF 插件。我能找到的所有示例都将“数据”硬编码到程序集中,如下例所示:
[Export( typeof( IRule ) )]
public class RuleInstance : IRule
{
public void DoIt() {}
public string Name
{
get { return "Rule Instance 3"; }
}
public string Version
{
get { return "1.1.0.0"; }
}
public string Description
{
get { return "Some Rule Instance"; }
}
}
如果我希望名称、版本和描述来自数据库怎么办?我如何告诉 MEF 从哪里获取该信息?
我可能遗漏了一些非常明显的东西,但我不知道它是什么。
您必须在通过属性加载后将信息传递给插件:
[Export( typeof( IRule ) )]
public class RuleInstance : IRule
{
puliic void DoIt()
{ }
public string Name { get; set; }
}
public class Program
{
[Import(typeof( IRule ))]
public IRule instance { get; set; }
public void Run()
{
// Load the assemblies here
instance.Name = "Rule Instance 3";
}
}
或者插件可以通过主机接口请求变量。您可以通过属性或构造函数参数传递 IHost 实例,但构造函数参数对于 MEF 来说并不简单。这是通过一个属性:
[Export( typeof( IRule ) )]
public class RuleInstance : IRule
{
puliic void DoIt()
{ }
public void Initialise()
{
// Load our name from the host, this cannot be done in the constructor
string name = Host.GetName(/* some parameters? */)
}
public IHost Host { get; set; }
public string Name { get; set; }
}
public interface IHost
{
string GetName(/* some parameters? */);
}
public class Program : IHost
{
[Import(typeof( IRule ))]
public IRule instance { get; set; }
public void Run()
{
// Load the assemblies here
// Make sure the plugins know where the host is...
instance.Host = this;
}
}
您还可以“导出”数据库接口并将其“导入”到任何需要数据库访问的插件中......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)