16

今後のプロジェクトのクライアント側の実装技術としてAdobeAIRを選択することを考えています。(以前の選択はC#とWPFでしたが、最近Flash / Flex / AIRに本当に感銘を受けました。)

しかし、私の製品の最も重要な機能の1つはプラグインアーキテクチャであり、サードパーティの開発者が機能とGUIを興味深い方法で拡張できるようにします。

C#でアーキテクチャを設計する方法を知っています。プラグインローダーは、ローカルの「app /plugins/」ディレクトリにあるすべてのアセンブリを列挙します。アセンブリごとに、すべてのクラスを列挙し、「IPluginFactory」インターフェースの実装を探します。工場で作成されたプラグインごとに、MVCクラスを要求し、GUI要素(メニュー項目、パネルなど)を既存のGUIレイアウトの適切なスロットにスナップします。

AIR内で同じことを実行したいと思います(Webからではなくローカルファイルシステムからプラグインをロードします)。この記事を読んだ後、私の理解はそれが可能であり、基本的なアーキテクチャ(サンドボックス化されたApplicationDomainsへのSWFのロードなど)は.NETで行う方法と非常に似ているということです。

しかし、私は落とし穴に興味があります。

Flash Playerを使用して動的なクラスローディングを行ったことがある場合(できれば、Flash / Flexの混合アプリで、特にAIRホスト内で)、プラグインフレームワークを構築した経験と、トリッキーな状況に遭遇した場所についてお聞かせください。フラッシュプレーヤー、およびフラッシュ、フレックス、およびAIRAPIを使用します。

たとえば、誰かが私にこれと同じ質問をしたが、Javaプラットフォームを念頭に置いている場合、JVMには「モジュール」または「アセンブリ」の概念がないことは間違いありません。最高レベルの集約は「クラス」であるため、大規模なプロジェクトを管理するためのプラグインシステム内に組織構造を作成することは難しい場合があります。また、複数のクラスローダーの問題と、それぞれがロードされたクラスの独自の個別のインスタンスを(独自の個別の静的変数を使用して)維持する方法についても説明します。


これが私にとってまだ答えられていないいくつかの特定の質問です:

1)actionscript "Loader"クラスは、SWFをApplicationDomainにロードできます。しかし、そのappdomainには正確に何が含まれていますか?モジュール?クラス?MXMLコンポーネントはどのように表現されますか?プラグインインターフェイスを実装するすべてのクラスを見つけるにはどうすればよいですか?

2)メインアプリケーションとは別のApplicationDomainにプラグインをロードした場合、他のappdomain内からコードを呼び出すのはかなり複雑ですか?アプリ間ドメインマーシャリングレイヤーを通過できるデータの種類について、重要な制限はありますか?マーシャリングは法外に高価ですか?

3)理想的には、自分のメインコードの大部分をプラグインとして開発し(メインアプリケーションはプラグイン読み込みシェルにすぎません)、プラグインアーキテクチャを使用してその機能をアプリに追加したいと思います。それはあなたの心に恐怖をもたらしますか?

4

4 に答える 4

6
  1. applicationDomain は名前空間に似ており、クラス定義をグループ化し、それらを階層に配置します。ドメインは、自身のドメインまたは親ドメインのシンボルに直接アクセスできますが、子ドメインまたは兄弟ドメインではアクセスできません(または、より良い: できます)。それを直接行う - 特定のクラスの定義を要求して、applicationDomain オブジェクトを通過する必要があります)。外部 swf をロードするとき、新しいシンボルを置く場所を決定できます: 子ドメイン (デフォルト)、システムに接続された新しいドメイン (null を使用)、現在のドメイン、別の場所に接続されたドメイン (明示的に新しいドメイン)。新しいシンボルが現在のドメインのシンボルを上書きすることはありませんが、同じ名前が複数のドメインに存在する可能性があることに注意してください。
    残念ながら、特定のドメイン内のクラスを列挙することはできません (まあ、少なくとも私はそれを行う方法を知りません) が、一般的な解決策は (「プラグイン インターフェイス」のように) 既知のクラスの存在を要求することです。これは、プラグインの定義 (クラス) またはプラグイン自体のいずれかを返します。
  2. どういうわけかオブジェクトへの参照(ファクトリ)を取得するだけで、それは単なる別のオブジェクトになります。マーシャリングはありません。ドメインは名前空間の単なる論理分割です (システム ドメインのツリー分岐です)。
  3. いいえ :) しかし、注意してください: GC にとっては簡単に地獄に変わる可能性があります。GC では、参照が他のドメインに広がっているため、未使用のドメインをアンロードできません。マルチコアの PureMVC フレームワークを検討することをお勧めします。プラグイン間の厳密な分離を確保するためのパイプが含まれている可能性があります。

ところで、Flash Player もセキュリティ ドメインの概念ですが、実際に触れたことがないので、ここにどのような可能性があるかはわかりません。

于 2008-12-05T21:02:15.603 に答える
5

ルカ・テッタマンティは、あなたの特定の質問に対してすでに適切な回答を提供しているので、一般的な主題に関する追加情報をいくつか提供します。

ModuleManagerクラス (およびmx.modulesパッケージ内の他のもの)を使用して Flex アプリ用の単純なプラグイン API を実装しました。その要点は、プラグインをサブクラス化し、ホスト アプリでModuleBase使用してそれらをロードすることです。ModuleManager次に、プラグインに共通インターフェース (例: IMyAppPlugin) を実装させ、ある種のファサードを使用して、プラグインが使用できるホスト アプリケーションへのインターフェースを表現および実装します (例: MyAppFacade implements IMyAppFacade)。プラグインがロードされるたびに、このファサード参照をプラグインに挿入します。

Flex 3 ヘルプのトピック「モジュラー アプリケーションの概要」には、いくつかの有益な情報があります (サブチャプター「モジュール ドメイン」では、モジュールのコンテキストにおけるアプリケーション ドメインについて説明しています)。

「デフォルトでは、モジュールは現在のアプリケーション ドメインの子ドメインに読み込まれます。ModuleLoader クラスの applicationDomain プロパティを使用して、別のアプリケーション ドメインを指定できます。」

「ApplicationDomain クラスの使用」のトピックでは、アプリケーション ドメインについてさらに詳しく説明しています。まだ読んでいない場合は、必ず読んでください。

于 2008-12-08T14:51:03.650 に答える
0

サブアプリケーションを読み込んでみましたか?
AIR でこれを行うための優れたドキュメントがあり、数時間で成功しました。ただし、サブアプリケーションとメイン アプリケーション間のサンドボックス違反のため、同じ実装が Flex では別の話です。私は何週間も頭を壁に打ちつけてきました。

于 2009-08-14T12:09:58.410 に答える
0

可能なプラグイン アーキテクチャとしての Java に関する声明への対応:

Java はプラグイン アーキテクチャ システムの考案に長年使用されてきたことがわかりました。クライアント側に関しては、Equinox OSGi モジュール管理フレームワークがおそらく最もよく知られています。ある時点で、Eclipse IDE は Equinox OSGi の上でプラグイン アーキテクチャをリファクタリングしました。Eclipse IDE はおそらく、これまでに考案されたクライアント側プラグイン アーキテクチャ システムの中で最も成功したものの 1 つです。これは、歴史的な長寿の観点から、そして幅広いユーザー ベースとプラグイン開発のフォローアップ コミュニティから見た場合です。また、任意のクライアント側アプリケーションを考案するための基本的なフレームワークとしてプラグイン アーキテクチャ (Eclipse RCP) も提供しています。

Java は、おそらくこれには非常に弱い選択肢として位置付けられていましたが、実際には、この種の動作するシステムを提供することにおいて、これまでのどの言語/ランタイム環境よりもはるかに成功しているため、特に C# .NET に対してもちろん、これにはモジュール用の優れた固有の機能があります。ちょっと皮肉ですが、これで終わりです。

Adobe AIRに関しては、私はこれがAIRで考案されているプロジェクトを開発管理しています。私たちの場合、モジュールの拡張機能は、ローカル ディレクトリではなく、常に Web サーバーから配信されます。フレックスには

<mx:Module/>

実行時に個別にロードできるモジュールを作成するためのタグ。

残念ながら、AIR のフラストレーションは、他のアプリケーションを起動するためのクラス API がないことです。URL を読み込んで、ユーザーの既定のブラウザーに何かを読み込むことはできますが、Excel などを起動することはできません。Java と C# の両方に、他のアプリを外部プロセスとして起動するための API があります。

于 2009-01-24T15:14:01.440 に答える