reflection - MEF:加载具有不同属性的部件(插件)

标签 reflection plugins c#-3.0 interface mef

简要背景:

我的团队决定使用 Microsoft 的托管可扩展性框架 (MEF) 来提供可扩展模型,以便将新的“提供者”添加到我们的系统中。

这使我们能够相对轻松地插入新的第三方提供商。

注意:MEF 的使用、启动和运行的简单性给我留下了深刻的印象。

我的问题:

由于这些提供程序通常具有与其关联的不同属性,因此在运行时将这些提供程序加载到系统中时,我们需要访问提供程序的数据流和属性。

由于属性不同,应采取什么方法才能与所述提供程序插件一起使用?注意到他们都做着类似的工作。

我的解决方案:

创建一个提供者必须遵守的接口(interface),从而在每个第三方提供者周围创建一个“包装器”,从而产生一致的接口(interface)/ 与每个提供商合作的编程模型。

插件=第3方数据源(提供者)+通用接口(interface)实现。

+ve: 所述插件不需要更复杂的基于反射的动态“插件”。

-ve: 必须为每个提供者编写一个包装器。 (无论如何,我们都需要添加 MEF 导出标签)

进一步说明:

对我来说,接口(interface)/包装器方法是最简单的,但我被告知要研究基于反射的方法,该方法可以利用反射来发现运行时可以公开的属性到系统。

我不赞成任何一种解决方案优于另一种解决方案,但我有兴趣听取社区的想法(其中大多数人比我更有经验)。

谢谢。

最佳答案

实际上,在预览 6 中,我们提供了未密封的导出,并允许您创建包含元数据的自定义导出属性,从而消除了部件作者添加单独导出的需要。我们所有的导入属性也都已解封。

[MetadataAttribute]
[AttributeUsage(AllowMultiple=false)] 
public class RuleAttribute : ExportAttribute {
  public RuleAttribute(string name, string description) {
    Name=name;
    Description=description;

  } : base(typeof(IRule))

  public string Name {get;private set;}
  public string Description {get; private set;}
}

上面的 RuleAttribute 导出 IRule,并且还允许提供名称元数据。

用法如下:

[Rule("AddOneRule", "Adds one to the value")]
public class AddOneRule {
}

HTH 格伦

关于reflection - MEF:加载具有不同属性的部件(插件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1212739/

相关文章:

c# - 内存违规在运行时动态附加到方法

scala - 如何从 AnyRef 对象获取反射的运行时方法?

c++ - 访问另一个插件中的类时出错(错误 : undefined reference)

jquery - jQuery UI 是 jQuery 插件吗?

c# - Gmail 是否支持 RFC 821?

c# - C# 3.0 中的命名/可选参数?

Java:循环内变量的几种可能类型

java - 如何使用IAdaptable类创建工作集? [Eclipse 插件]

.net-3.5 - IIS7.0 到 IIS6.0

java - 如何从 Java 反射中隐藏方法?