我正在升级一个 插件加载引擎 (
我的问题是
我考虑了一个可以捕获所有插件错误并对其进行处理的单独层。
我想象了一种附加到每个
我也在考虑面向切面编程可能是一个很好的方式。我查看了一些框架,如 Spring.NET。但不确定它是否适用于我的情况。 [更新] 以下是更多设计细节:
以下是
.NET
),它执行以下操作:
- 加载插件
- 将它们连接到适当的数据源
- 启动插件
- 显示结果
IPlugin
,并且每个插件都在单独的BackgroundWorker
中启动。所有BackgroundWorkers
都由名为Host
的模块管理。我的问题是
错误/异常处理
。该引擎已经部署,我想找到一种优雅的方式来处理可能在插件运行时抛出的错误/异常
。有些异常
在插件中被捕获,但不是全部。我考虑了一个可以捕获所有插件错误并对其进行处理的单独层。
我想象了一种附加到每个
Plugin
的Context
,其中包含其进度级别(BackgroundWorker.ReportProgress
)、状态、抛出的异常(使用RunWorkerCompletedEvent
),但只有在BackgroundWorker
停止后才会抛出错误。当抛出异常时,我希望能够中断它。我也在考虑面向切面编程可能是一个很好的方式。我查看了一些框架,如 Spring.NET。但不确定它是否适用于我的情况。 [更新] 以下是更多设计细节:
- IPlugin接口:称为
AbstractEnvChecker
:
DLL
被加载,并在简单的Windows窗体中向用户显示列表。然后,用户选择要启动的插件,调用Plugin.DoWork()
方法。以下是
Host
如何启动所选插件:void LaunchPlugin(AbstractEnvChecker p_Plugin)
{
if (p_Plugin != null)
{
BackgroundWorker l_BackgroundWorker = new BackgroundWorker();
l_BackgroundWorker.WorkerReportsProgress = true;
l_BackgroundWorker.WorkerSupportsCancellation = true;
l_BackgroundWorker.DoWork +=
new DoWorkEventHandler(bw_DoWork);
l_BackgroundWorker.ProgressChanged +=
new ProgressChangedEventHandler(bw_ProgressChanged);
l_BackgroundWorker.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
m_PluginByThreadMap.Add(l_BackgroundWorker, p_Plugin);
l_BackgroundWorker.DoWork += p_Plugin.DoWork;
l_BackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(l_BackgroundWorker_RunWorkerCompleted);
l_BackgroundWorker.RunWorkerAsync(p_Plugin);
}
}
AOP
是否是添加错误处理层的适当解决方案?
IPlugin
接口是什么样子的?这是什么类型的应用程序:富客户端、控制台应用程序/计划任务...? - Marijn