整理整頓についての質問です。プロジェクトはすでに機能しています。デザインには満足していますが、結び付けたい未解決の点がいくつかあります。
私のプロジェクトにはプラグイン アーキテクチャがあります。プログラムの本体は、それぞれが独自の AppDomain に存在するプラグインに作業をディスパッチします。
プラグインは、メイン プログラム (呼び出しの署名を取得するためDispatchTaskToPlugin
) とプラグイン自体によって API コントラクトとして使用されるインターフェイスで記述されます。
namespace AppServer.Plugin.Common
{
public interface IAppServerPlugin
{
void Register();
void DispatchTaskToPlugin(Task t);
// Other methods omitted
}
}
プログラムの本体でRegister()
が呼び出され、プラグインがそのコールバック メソッドを基本クラスに登録できるようになり、後でDispatchTaskToPlugin()
が呼び出されてプラグインが実行されます。
プラグイン自体は 2 つの部分に分かれています。プラグインのフレームワーク (セットアップ、ハウスキーピング、ティアダウンなど) を実装する基本クラスがあります。DispatchTaskToPlugin
が実際に定義されている場所は次のとおりです。
namespace AppServer.Plugin
{
abstract public class BasePlugin : MarshalByRefObject,
AppServer.Plugin.Common.IAppServerPlugin
{
public void DispatchTaskToPlugin(Task t)
{
// ...
// Eventual call to actual plugin code
//
}
// Other methods omitted
}
}
Register()
実際のプラグイン自体は、(基本クラスに最終的に呼び出すデリゲートを与えるための) メソッドを実装してから、それらのビジネス ロジックを実装するだけで済みます。
namespace AppServer.Plugin
{
public class Plugin : BasePlugin
{
override public void Register()
{
// Calls a method in the base class to register itself.
}
// Various callback methods, business logic, etc...
}
}
基本クラス ( BasePlugin
) では、プラグインが使用するために、あらゆる種類の便利なメソッド、収集されたデータなどを実装しました。その長引く方法を除いて、すべてがコーシャDispatchTaskToPlugin()
です。
クラスの実装から呼び出し可能であることは想定されていません-それらはそれを使用しません。Plugin
これは、プログラム本体のディスパッチャでのみ必要です。 派生クラス ( ) が基本クラス ( ) のメソッドを認識しないようにするにはどうすればよいですか?Plugin
BasePlugin/DispatchTaskToPlugin
髪を分割DispatchTaskToPlugin()
して、派生クラスから呼び出された場合は例外をスローできますが、納屋のドアを閉めるのが少し遅れています。私はそれを Intellisense から遠ざけるか、おそらくコンパイラにこれを任せたいと思います。
提案?