プラグインの読み込みの問題が解決したら (MEF を介した .NET の場合)、解決する次のステップはプラグインとの通信です。簡単な方法は、インターフェースを実装してプラグイン実装を使用することですが、プラグインはアプリケーションの動作方法を拡張するだけでよく、多くの拡張ポイントが存在する場合があります。
私の質問は、その拡張ポイントをどのように処理するかについてです。私はそれを行うさまざまな方法を見てきましたが、それぞれの長所と短所、およびこれを達成するためのより良い方法があるかどうかはわかりません。
- イベント: 「拡張可能」にしたいすべてのものに静的イベントを追加します。たとえば、User クラスのカスタム検証を追加したい場合、OnValidation 静的イベント ハンドラーを追加し、プラグインの構築時にイベントを追加できます。
- メッセージング: バスとメッセージを持つこと。プラグインは特定のメッセージをサブスクライブし、他のクラスがそのメッセージを発行したときに何かを行うことができます。メッセージには、プラグインが機能するコンテキストが含まれている必要があります。検証の場合、ロジック レイヤーは UserValidation メッセージを発行し、メッセージが受信されるとプラグインが動作します。
- インターフェース: ホスト アプリケーションは、特定のインターフェースを実装するすべてのプラグインを呼び出して、現在の操作のコンテキストを提供する責任があります。検証の場合、プラグインは Validate(object context) メソッドを使用して IValidator または IUserValidator を実装できます。
公開されたアプローチのいずれかを使用したことがありますか? どれがあなたにとって最も効果的でしたか?
ご質問の前に、私たちのアプリケーションは、その上にクライアント固有のコンテンツ中心の Web アプリケーションを構築するための拡張可能なコア (ユーザー、ローラ、およびコンテンツ管理) です。すべてが ASP.NET MVC 上に構築されています。