0

整理整頓についての質問です。プロジェクトはすでに機能しています。デザインには満足していますが、結び付けたい未解決の点がいくつかあります。

私のプロジェクトにはプラグイン アーキテクチャがあります。プログラムの本体は、それぞれが独自の 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これは、プログラム本体のディスパッチャでのみ必要です。 派生クラス ( ) が基本クラス ( ) のメソッドを認識しないようにするにはどうすればよいですか?PluginBasePlugin/DispatchTaskToPlugin

髪を分割DispatchTaskToPlugin()して、派生クラスから呼び出された場合は例外をスローできますが、納屋のドアを閉めるのが少し遅れています。私はそれを Intellisense から遠ざけるか、おそらくコンパイラにこれを任せたいと思います。

提案?

4

2 に答える 2

1

プラグインが実際に 1 つのメソッドのみをオーバーライドすることを意図している場合は、メソッドを 1 つだけ使用してインターフェイスを実装することをお勧めします。その後、現在BasePluginは継承の代わりにコンポジションを使用して、インターフェイスのみに基づいて「実際の」プラグインを処理できます。プラグインがイベントをサブスクライブできるように何かを渡す必要があるかもしれませんが、それRegisterはインターフェースとして表現することもできるので、プラグインはあなたが望むものだけを見ることができます。

于 2009-07-10T14:48:13.687 に答える
1

明示的な実装を使用して、DispatchTaskToPlugin を BasePlugin に非公開で実装できます。

public class Task
{
}

 public interface IAppServerPlugin     
 {        
     void Register();        
     void DispatchTaskToPlugin(Task t);        
 }

abstract public class BasePlugin : MarshalByRefObject, IAppServerPlugin    
{
    public abstract void Register();

    void IAppServerPlugin.DispatchTaskToPlugin(Task t)
    {
    } 
}

public class Plugin : BasePlugin    
{       
    override public void Register()        
    {             
    }   

    public void Something()
    {
        this.DispatchTaskToPlugin(null); // Doesn't compile
        base.DispatchTaskToPlugin(null); // Doesn't compile
    }

}

class Program
{
    static void Main(string[] args)
    {
        Plugin x;
        x.DispatchTaskToPlugin(null); // Doesn't compile
    }
}
于 2009-07-10T14:54:01.260 に答える