插件架构中的reflection与属性

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

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

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

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

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

您担心一次性操作可能导致性能下降,因为以后可能会有多个插件。

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

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

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

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

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

这基本上是Mono.Addins框架遵循的方法。

我曾经想过,要求所有使用属性标记的类的程序集也会使用reflection。 然后归结为元数据,接口实现或属性标记中的更快查找?