我需要一些基本的“可插拔”架构,并且很好奇我对实现的假设和想法是否与我相信的一样。设置包含支持某些功能的所有类的“插件注册表”的基本过程如下:
- 反思程序集中的类并找到它们中的任何一个继承自插件基类。
- 生成一个新的“ModulePlugin”对象,该对象存储类名中的名称并获取对派生类型的引用,并可能从属性中获取一些元信息,例如“插件类型”。
- 上面的插件类型将根据请求创建派生类型的新实例,但在上面的“ModulePlugin”对象中将其作为插件基类返回。
- 将生成的插件存储在列表中
在第四步中,我使用带有静态类型初始化程序的静态类“PluginRegistry”执行此操作,并将生成的数据结构(List < Plugin>)存储在静态只读 IEnumerable<Plugin> 中。
在整个应用程序中,我以这种方式使用插件:
PluginRegistry.Plugins.Where(plugin => plugin.Type == Logger).Foo();
这是在 ASP.NET MVC 应用程序中。我假设:
- 在发生并发访问的情况下,类型初始化器/构造器可以安全地使用(ASP.NET)
- 对于给定的应用程序池生命周期,所需的反射只会运行一次,更准确地说,不会为每个请求一遍又一遍地运行,因为这是一个使用类型初始化的静态类。
我有一个可运行的原型,但我担心无法预料的问题。
我的假设是否正确,是否有任何我应该注意的问题?