我正在构建一个基于 .NET 的应用程序,并希望允许一个更可扩展和可插拔的设计。
为了简单起见,应用程序公开了一组操作和事件:
- 做一点事()
- 做其他事情()
- 错误
- 成功
我想提供“插件”以加载并挂钩其中一些操作(例如:当 Event1 触发时,运行 plugin1)。
例如 --当OnError事件触发时运行plugin1.HandleError() 。
这可以通过事件订阅轻松完成:
this.OnError += new Plugin1().HandleError();
问题是:
- 我的应用不知道“Plugin1”类型(它是一个插件,我的应用不直接引用它)。
- 这样做会在时间之前实例化插件,这是我不想做的。
在“传统”插件模型中,应用程序(插件的“客户端”)在某些关键点加载并执行插件代码。例如——图像处理应用程序,当执行某个操作时)。
客户端应用程序知道何时实例化插件代码以及何时执行它的控制。
在我的应用程序中,插件本身决定何时执行(“插件应在 OnError 事件上注册”)。
将插件“执行”代码与“注册”代码一起保存会带来一个问题,即插件 DLL 将在注册时加载到内存中,这是我希望防止的。
例如,如果我在插件 DLL 中添加一个 Register() 方法,则插件 DLL 必须加载到内存中才能调用 Register 方法。
对于这个特定问题,什么是好的设计解决方案?
- 延迟加载(或提供延迟/急切加载)插件 DLL。
- 允许插件控制它们连接到系统/应用程序的各个部分。