1

私は、アプリケーションが実行時にインターフェースを実装するクラスを作成して、プラグ可能な機能を許可する「プラグイン」システムを実装しました。

プラグイン アセンブリ内で指定されたインターフェイスを実装するすべてのクラスで Activator.CreateInstance を使用して、これを実現しています。

現時点では、クラスの実装を 1 つだけ使用しており、そのために 2 つのコンストラクター引数があり、それらを Activator.CreateInstance 呼び出しに含めています。

 instanceList.Add((Foo)Activator.CreateInstance(_TypeList[typeKey], new object[] { arg1, arg2 }));

このコンストラクター署名を使用しない実装が追加された場合、これが後で問題を引き起こす可能性があることを認識しています。これを処理するのに最適な状況は何ですか。

コンストラクターがこの署名を使用する必要があることをドキュメントを介して明示的に言い、それを try/catch で囲みますか?

または、クラスが持つコンストラクターを呼び出す方法はありますか? どういうわけかコンストラクターの引数を一致させる必要があることを念頭に置いてください。

または...引数を静的クラスに静的プロパティとして配置することにより、コンストラクターの引数を回避しますか?

4

2 に答える 2

1

まず、コードをリファクタリングして構造を抽象化し、ファクトリ クラスにします。次に、ファクトリが使用する戦略により、最善の方法 (異なる場合) と、コンストラクターの欠落などのエラーが発生した場合の対処方法を決定できます。ジェネリックを使用して、必要に応じてインターフェイスを強くまたは緩く型付けすることができます。

私はActivatorに固執します。私たちはこの種の構築で多くの作業を行い、実行時に発見された型に基づく遅延バインディング、シングルトン、型エイリアシング、カスタム セキュリティなど、多くのものを獲得しました。

于 2009-08-02T23:48:06.040 に答える
1

すべてのプラグインに、パラメーターのないコンストラクターが必要であり、いくつかの一般的な引数を使用して初期化メソッドをインターフェイスに追加する必要があります。

プラグインの考えられるすべての実装で必要な引数を知る方法はありません。

于 2009-08-02T23:48:49.207 に答える