web-dev-qa-db-ja.com

プラグイン可能なソフトウェアを構築するにはどうすればよいでしょうか?

ある種のアプリケーションがあり、ユーザーがそのためのプラグインを作成できるようにしたい場合、アプリケーションをどのように設計すればよいですか?

あなたは何を考慮に入れなければなりませんか、これにはどのようなデザインパターンがありますか?

21
user9238

それはちょっとあなたのプラットフォームに依存しますが、覚えておくべきいくつかの一般的なこと

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

分離プラグインは彼らが望むことは何でもできますか?あなたはいつも彼らを信頼していますか?または、何らかのサンドボックスでそれらを実行して権限をリクエストする必要がありますか?.

アップデートプラグインのアップデートはどのように処理しますか?

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

Serializationある種の分離を使用する場合、多くの場合、異なるスレッドまたはプロセス間で情報をシリアル化する必要があります。どのようにしてそれを最も効率的に行いますか?

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

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

別の良い考え方は、「プラグインはこれらのすべてを(コードで)実行するのではなく、「プラグインはこの情報を提供する必要がある」と考えることです。そうすることで、アプリケーションは必要な情報を消費し、単純化する実際の処理を実行できますプラグイン。

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

14
Homde

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

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

Javaの場合、 Eclipse Plug-in Architecture があります。

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

  • ホストとエクステンション間のコントラクト(通常はインターフェース)を定義します。
  • あなたは出て、インストールされた拡張機能を探す発見メカニズムが必要です
  • 拡張を動的にロードしてホストに認識させる必要がある

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

9
Scott Whitlock

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

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

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

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

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

3
Falcon