プラガブルなソフトウェアをどのように構築しますか?


20

何らかのアプリケーションがあり、ユーザーがプラグインを作成できるようにしたい場合、アプリケーションをどのように設計する必要がありますか?

何を考慮に入れる必要がありますか、これにはどのようなデザインパターンがありますか?


オブザーバーのようなパターンは、メディエータは、責任のコマンド広告チェーンが頭に浮かぶ
MCHL

3
@Mchl:コメントとしてではなく、回答として回答を投稿してください。
S.Lott

あなたは見てとるべきMEFおよびMSDN情報を
リュックボス

そのためには十分に詳細ではないと感じています
Mchl

@Mchl:「十分に詳しくない」?では、なぜコメントするのでしょうか?それは明らかに答えです。回答を回答として投稿してください。
S.Lott

回答:


13

プラットフォームによって多少異なりますが、留意すべき一般的な事項がいくつかあります

バージョン管理 アプリケーションを更新すると、古いプラグインはすべて廃止されます(firefoxの問題)

分離 プラグインは何でもできますか?常に信頼していますか?または、何らかのサンドボックスでそれらを実行し、許可を要求する必要がありますか。

更新 プラグインの更新はどのように処理しますか?

セキュリティ プラグインの作成者をどのようにして保証し、なりすましやユーザーが悪意のあるコードをインストールするようにだまされるのを防ぎますか。通常、何らかのコード署名によって解決されます

直列化は、 あなたには、いくつかの種類のアイソレーションを使用するときに多くのあなたは、別のスレッドやプロセス間で情報をシリアル化する必要があります。それを最も効率的に行う方法は?

拡張性 どのような側面を拡張する必要がありますか?APIが扱いにくくなることなく、プラグインの可能性をどのように最大化しますか。

プラグインのサードパーティ開発者をターゲットにしている場合、最も重要なことは(私の経験から)プラグインAPIとクラスをアプリケーションの他の部分とは完全に異なるものとみなし、簡単に開発できるようにすることですできるだけ。メインアプリからプラグインに「ブリードオーバー」するのは非常に簡単なので、プラグインの作成者は必要以上に学ぶ必要があります。プラグインの作成者としてどのようなインターフェイスとエクスペリエンスが必要かを考えて、簡単に作成してください。

別の良い考え方は、「プラグインはこれらすべてのことを(コードで)行うのではなく、「プラグインはこの情報を提供する必要がある」」と考えることではありません。プラグイン。

また、一般的に、コードではなく記述的なアプローチ(xmlなどのメタデータ)を使用できる場合は常に、メタデータの転送、バージョン管理、デプロイ、セキュリティ保護が容易であり、サードパーティがより簡単に構成できるため、大きな利点があります


1
+1それは質問に直接答えませんが、これらは心に留めておくべき重要な問題です
アドリアーノカルネイロ

私は、これらの問題は、実際の拡張メカニズムを開発し、誰が始まる前に覆われていると考えている
のGus

9

これを書いた .NETでの拡張性のためにMEFを使用するコードプロジェクトの記事。それは良い紹介です。

SharpDevelopのアドインアーキテクチャMono.Addinsなど、.NET用の他の拡張性フレームワークがあります。System.AddIn

Javaには、 Eclipse Plug-in Architectureがあります。

一般的なパターンは次のとおりです。

  • ホストと拡張機能の間のコントラクト(通常はインターフェイス)を定義します
  • 外に出て、インストールされている拡張機能を探す検出メカニズムが必要です
  • 拡張機能を動的にロードし、ホストにそれらを認識させる必要があります

実際には、依存性注入および戦略パターンと多くのことを共有しています。


+1 MEFとSystem.AddInは両方とも良い点です。最終的にそれらを使用しなくても、両方とも良い概念を示します。
RationalGeek

@jkohlhepp-同意します。また、SharpDevelopアーキテクチャについて深く掘り下げることをお勧めします。これについては、多くの記述があり、オープンソース(つまりMEFである)であり、適切に設計されているからです。
スコットホイットロック

3

プラグインのインターフェースを提供するだけです。

少なくともActivate-Methode(エントリポイント)が含まれている必要がありますが、Initializeなども必要になります。

また、たとえばメニュー項目を登録するなど、レジストリのような方法でホストアプリケーションと通信する可能性があるはずです。そのため、プラグインに対して変更可能/拡張可能なもののレジストリを提供する必要があります。

また、プラグインがそのルーチンを呼び出すことができるように、ホストアプリケーションのデータとオブジェクト用のアクセス可能なストレージが必要です。これは、UnityなどのDIコンテナーを使用してプラグインにアクセスさせることで簡単に実行できるため、必要なサービスを解決できます。

Event-Aggregatorもおそらく良いアイデアです。したがって、プラグインはイベントをスローし、他のプラグインやホストアプリケーションからのイベントに切り離された方法で反応することができます。あなたは間違いなく欲しいです!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.