4

私はプロトコルハンドラを構築しています。プロトコルは不明なリクエスト タイプのセットをサポートしている可能性があり、各リクエスト タイプを実装する単一のクラスを用意します。これらのリクエスト ハンドラ クラスは、基本ハンドラ クラスを拡張します。新しいリクエスト タイプをサポートするには、そのためのクラスを追加し、サービスを再コンパイル/デプロイ/再起動するだけでよいように、システムを構築しようとしています。

だから私はこのようなものを持っています:

foreach (Type classType in protocolAssembly.GetTypes())
{
    if (classType.BaseType == typeof(ProtocolRequestHandler))
    {
        if (supportedRequestsMap.Contains(classType.Method))
        {
            // error: that method is already implemented!
        }

        supportedRequestsMap.Add(classType.Method, typeof(classType));
    }
}

新しいクラスの追加は、サービスが処理するリクエスト メソッドが宣言されている限り、サービスの再起動時に取得されます。

プロパティMethodが実装される基本クラスProtocolRequestHandlerを介してコンパイル時に強制するにはどうすればよいですか? メソッドタイプを「Null」または「Unknown」として使用したり、例外をスローしたりしたくありません。また、サポートされているプロトコル要求タイプを拡張クラスの名前で本質的に指定したくありません (私は私が好きなクラス)。

プロパティの値が継承クラスに設定されていることを強制する方法はありますか?

この種の動的読み込みを行うためのよりクリーンな方法はありますか? 継承クラスのサポートされているメソッドを決定するために属性を使用する必要がありますか?

4

2 に答える 2

4

プラグインによって実装されるメソッドのコントラクトとして、インターフェイスに依存する必要があります。
(少し古いですが、非常に関連性の高い) 素晴らしいチュートリアルがここにあります

于 2012-12-27T23:56:09.073 に答える
0

基本クラスを使用している場合は、必要なメソッドを抽象メソッドとして (または仮想で、可能であればデフォルトの実装を指定して) 作成しないでください。これにより、メソッドが継承されたクラスに存在することが保証されます。リフレクションに興味があり、独自のプロトコル ハンドラーを作成している場合は、おそらく既にこれを知っていると思いますが、必要なものを取得するためのより良い方法があるかどうかはわかりません。

于 2012-12-27T23:59:04.190 に答える