次のことを行うPlugin Loading Engine ( ) をアップグレード.NET
しています。
- プラグインをロードします
- それらを適切なデータソースに接続します
- プラグインを起動します
- 結果を表示します
すべてのプラグインは同じ Interface を実装しており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
エラー処理レイヤーを追加する適切なソリューションはありますか?