插件架构中的反射与属性

时间:2009-06-01 13:11:51

标签: c# .net reflection architecture plugins

我正在开发一个从子目录启动时加载插件的应用程序,目前我正在通过使用反射来迭代每个程序集的类型并查找实现IPluginModule接口的公共类。

由于Reflection涉及性能损失,并且我希望在一段时间后会有几个插件,我想知道在程序集级别定义应用的自定义属性是否有用,可以在迭代类型之前进行检查(可能在程序集中有十几种类型,包括IPluginModule的1个实现者)。

该属性(如果存在)可以提供返回所需类型或实例的方法,然后迭代类型将只是一个回退机制。在配置文件中存储类型信息不是一种选择。

这会改善性能,还是与实际从存储加载程序集的时间相比无关紧要?此外,这种用法是否适用于属性?

5 个答案:

答案 0 :(得分:7)

您还可以在配置中使用可插入类型,因此您可以知道确切的类而不是循环遍历所有类。必须为此选项配备一些配置实用程序...但是根据您循环的类的数量,可能会获得良好的性能提升。

答案 1 :(得分:7)

我将用一个问题回答你的问题:你为什么担心这个问题?

您在一次操作中担心潜在的性能损失,因为可能以后会有几个插件。

除非您的应用程序启动时间对用户来说过长,否则我不会浪费时间考虑它 - 您可以使用更好的方法来改进应用程序。

答案 2 :(得分:3)

我相信Microsoft的两个.net插件框架,Managed AddIn Framework(MAF)和Managed Extensibility Framework(MEF)都可以使用属性或反射来发现插件。所以微软似乎觉得属性是合适的。

但我不确定性能差异是什么。

答案 3 :(得分:1)

一个好的解决方案是缓存有关插件的所有信息。应用程序第一次启动时,它会对插件dll进行全面扫描,并保存文件中找到的类型列表。下次应用程序启动时,它会加载文件中的信息,这比再次扫描所有dll要快得多。应用程序还可以存储每个dll的时间戳,因此如果它检测到dll中的更改,则可以重新扫描它并更新缓存。

这基本上是Mono.Addins framework所遵循的方法。

答案 4 :(得分:0)

我原以为要求所有使用属性标记的类的程序集也会使用反射。然后,它将归结为元数据,接口实现或属性标记中的更快查找?