我正在升级一个插件加载引擎(.NET
),它执行以下操作:
- 加载插件
- 将它们连接到适当的数据源
- 启动插件
- 显示结果
所有插件都实现相同的接口:IPlugin
每个插件都在单独的BackGroundWorker
. 所有这些BackgroundWorkers
都由一个名为Host
.
我的问题是Errors/Exceptions Handling
. 引擎已经部署,我想找到一种优雅的方式来处理Errors/Exceptions
插件运行时可能引发的问题。有些Exceptions
被插件捕获,但不是全部。
我正在考虑一个单独的层,它可以捕获错误并为所有插件处理它们。
我想象了一种Context
附加到每个Plugin
包含它的进度级别(BackgroundWorker.ReportProgress
)、它的状态、抛出的异常(使用RunWorkerCompletedEvent
)但只有在BackgroundWorker
停止之后才会抛出错误。我想在抛出异常时中断它。
我还认为面向方面的编程可能是一个好方法。我上网查了一下,找到了一些类似Spring.NET的框架。但不确定它是否适合我的情况。
[更新] 这里有更多的设计细节要求:
- IPlugin 接口:调用
AbstractEnvChecker
:
该应用程序是一个富客户端应用程序。编译插件后,DLL
加载生成的插件,并在一个简单的 Windows 窗体中向用户显示一个列表。然后用户选择要启动的插件并Plugin.DoWork()
调用该方法。
以下是主机启动所选插件的方式:
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
添加错误处理层是否合适?