Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用未硬编码到程序集中的数据填充MEF插件?_C#_Database_Mef - Fatal编程技术网

C# 如何使用未硬编码到程序集中的数据填充MEF插件?

C# 如何使用未硬编码到程序集中的数据填充MEF插件?,c#,database,mef,C#,Database,Mef,我正在开发一个可以与各种硬件进行通信的程序。由于它通信和控制的项目的不同性质,我需要为每个不同的硬件拥有不同的“驱动程序”。这让我认为,MEF将是一个伟大的方式,使这些驱动程序作为插件,即使在产品发布后也可以添加 我已经看过很多关于如何使用MEF的例子,但是我还没有找到答案的问题是如何用外部数据(例如来自数据库)填充MEF插件。我能找到的所有示例都将“数据”硬编码到程序集中,如以下示例: [Export( typeof( IRule ) )] public class RuleInstanc

我正在开发一个可以与各种硬件进行通信的程序。由于它通信和控制的项目的不同性质,我需要为每个不同的硬件拥有不同的“驱动程序”。这让我认为,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;
    }             
}

您还可以“导出”数据库接口并将其“导入”到需要访问数据库的任何插件中…

您始终可以导出单个值(通过合同名称),下面是一个示例:

public class Configuration
{
  [Export("SomeValue")]
  public string SomeValue
  {
    get { /* return value from database perhaps? */ }
  }
}

[Export(typeof(IRule))]
public class RuleInstance : IRule
{
  [Import("SomeValue")]
  public string SomeValue { get; private set; }
}

是的,这些是有道理的。这些看起来确实很简单。在主机示例中,使用了“Initialize()”函数。如果导出可组合部件中存在该函数,MEF是否总是调用该函数?@hjoelr否,MEF不会自动调用该函数。你得从主人那里打电话。您还可以导出主机,从插件导入主机,然后在插件上实现iPartimportsAssetFiedNotification接口,并让它们在OnImportsAssetId方法中进行初始化。