简要背景:
我的团队决定使用 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/