Managed Extensibility Framework(MEF)とManaged AddIn Framework(MAF、別名System.AddIn)は、非常によく似たタスクを実行するようです。このStackOverflowの質問によると、MEFはSystem.Addinの代わりになりますか?、両方を同時に使用することもできます。
どちらを使用するのか、もう一方を使用するのはいつですか。どのような状況で、両方を一緒に使用することを選択しますか?
Managed Extensibility Framework(MEF)とManaged AddIn Framework(MAF、別名System.AddIn)は、非常によく似たタスクを実行するようです。このStackOverflowの質問によると、MEFはSystem.Addinの代わりになりますか?、両方を同時に使用することもできます。
どちらを使用するのか、もう一方を使用するのはいつですか。どのような状況で、両方を一緒に使用することを選択しますか?
私はこれらのオプションを評価してきましたが、これが私が得た結論です。
MAFは真のアドオンフレームワークです。アドオンを完全に分離し、別のアプリドメイン内で実行することもできます。これにより、アドオンがクラッシュした場合でも、アプリケーションが停止することはありません。それはまた、あなたがそれらに与える契約以外のものに依存することからアドオンを切り離す非常に完全な方法を提供します。実際、メインアプリのアップグレード中に、コントラクトアダプターをバージョン管理して、古いアドオンとの下位互換性を提供できます。これは素晴らしいことのように聞こえますが、appdomainsを越えるために支払わなければならない高額な費用が伴います。あなたはスピードでそしてまたあなたが前後に送ることができるタイプの柔軟性でこの価格を支払います。
MEFは、依存性注入に似ていますが、発見可能性や...(これに空白を描画する)などのいくつかの追加の利点があります。MAFが持つ分離の程度はMEFには存在しません。それらは、2つの異なるもののための2つの異なるフレームワークです。
ダニエルグが言ったことは良いことです。私は追加します:
System.Addinsに関するビデオを見ると、彼らは明らかに非常に大規模なプロジェクトについて話している。彼は、ホストアプリケーションを管理する1つのチーム、各アドインを管理する別のチーム、および契約とパイプラインを管理する3番目のチームについて話します。それに基づいて、System.Addinsは明らかに大規模なアプリケーション向けだと思います。SAPのようなERPシステムなどのアプリケーションを考えています(それほど大きくはないかもしれませんが、あなたはその考えを理解しています)。これらのビデオを見ると、System.Addinsを使用するための作業量が非常に多いことがわかります。多くの企業がシステム用にサードパーティのアドインをプログラミングしていて、死刑に処せられてそれらのアドイン契約を破ることができない場合、それはうまくいくでしょう。
一方、MEFは、SharpDevelopのアドインスキームであるEclipseプラグインアーキテクチャまたはMono.Addinsとの類似点が多いようです。System.Addinsよりもはるかに理解しやすく、はるかに柔軟であると私は信じています。失うものは、AppDomainの分離やMEFとの強力なバージョン管理契約をすぐに利用できないことです。MEFの長所は、アプリケーション全体をパーツの構成として構成できるため、さまざまな顧客向けにさまざまな構成で製品を出荷でき、顧客が新しい機能を購入した場合は、その機能のパーツをインストールディレクトリにドロップするだけです。そして、アプリケーションはそれを見て実行します。また、テストも容易になります。テストするオブジェクトをインスタンス化し、そのすべての依存関係についてモックオブジェクトをフィードできます。
私が言及したい最も重要な点は、System.Addinsはすでにフレームワークに含まれていますが、それを使用しているという証拠はあまり見られませんが、MEFはCodePlexに含まれていると思われる場所に座っているだけです。 .NET 4、そして人々はすでにそれを使ってたくさんのアプリケーションを構築し始めています(私自身も含みます)。それは2つのフレームワークについて何かを教えてくれると思います。
MAFアプリケーションを開発して出荷した。MAFに関する私の見解はややうんざりしています。
MAFは、最悪の場合、「分離された」システムまたは「緩く結合された」システムです。MEFは、せいぜい「結合」システムまたは「緩い結合」システムです。
MAFを使用して実現したMAFの利点は次のとおりです。
アプリケーションの実行中に新しいコンポーネントをインストールするか、既存のコンポーネントを更新します。アドインは、アプリケーションの実行中に更新でき、更新はユーザーにシームレスに表示されます。そのためのAppDomainが必要です。
購入したコンポーネントに基づくライセンス。ユーザーの役割と権限によってロードされるアドインと、アドインの使用がライセンスされているかどうかを制御できます。
迅速な開発(市場投入までの時間の短縮)。AddIn開発は、アジャイル手法に完全に適合します。開発チームは、アプリケーションの他の部分との統合部分も開発することなく、一度に1つのAddInを開発しました。
改善されたQA(一度に1つのコンポーネントのみのQA)。その後、QAは、機能の1ビットの欠陥をテストして発行できます。テストケースは、開発と実装が簡単でした。
展開(コンポーネントが開発およびリリースされ、「正常に機能する」ときにコンポーネントを追加します)。展開は、アドインを作成してファイルをインストールするだけです。他の考慮事項は必要ありませんでした!
新しいコンポーネントは古いコンポーネントで機能しました。早い段階で開発されたアドインは、機能し続けました。新しいアドインは、アプリケーションにシームレスに適合します
私の見解では、2つのテクノロジーは実際には非常に異なるユースケースを対象としています。
MEFは通常、最終的な統合ソリューションを提供する個人またはグループがすべてを組み立てて全体的な整合性を保証するが、主要な機能のさまざまな実装が必要な純粋な依存性注入シナリオに最適です。
MAFは、誰か/グループがプラットフォームまたはホストを開発していて、他のグループが事後に、ホストグループの制御下にない方法で機能を追加するシナリオ用です。このシナリオでは、不正なアドインからホストを「保護」する(またはアドインを相互に保護する)ためのより複雑なメカニズムが必要です。
3番目の類似パターンテクノロジーは、ProviderBaseスキーム全体です。これにより機能の置き換えも可能になりますが、その目標は実際にはホスト/アプリが機能を絶対に必要とし、構成を介してさまざまな実装を指定する必要があるシナリオです。
MAFとMEFの両方について説明しているこの長い記事を見つけました。 http://emcpadden.wordpress.com/2008/12/07/managed-extensibility-framework-and-others/
他の回答によるポイントに加えて、MEFとMAFの主な違いの1つは、ManagedExtensibilityFrameworkによって1つの構成可能なパーツが別のパーツに依存できるようになることです。たとえば、プラグインを別のプラグインに依存させることができます。
また、Managed Extensibility Frameworkは、System.AddInのように、ホストとアドインを実際に区別しません。MEFに関する限り、それらはすべて単なる構成可能なパーツです。
私の意見では、違いを発見する最良の方法は、いくつかの実践的なコードです。2つのMSDNウォークスルーを見つけました。どちらも計算機の例を使用しているため、実装を簡単に比較できます。
MEF :MEFパーツを使用した簡単な計算機の例
(
管理された拡張性フレームワーク)
catalog.Catalogs.Add(new DirectoryCatalog("Plugins", "*.dll"));
代わりにを使用して例を変更し、DLLプロジェクトを分離するように契約することができます。)catalog.Catalogs.Add(new
AssemblyCatalog(typeof(Program).Assembly));
MEFは特定のディレクトリ構造を持つ必要はなく、小さなプロジェクトでも簡単に使用できます。属性と連携して、エクスポートされるものを宣言します。これは、読みやすく、理解しやすいものです。例:
[Export(typeof(IOperation))]
[ExportMetadata("Symbol", '+')]
class Add: IOperation
{
public int Operate(int left, int right)
{
return left + right;
}
}
MEFはバージョン管理を自動的に処理しません
MAF: V1およびV2バージョンのMAFプラグイン
を備えたシンプルな計算機
(管理されたA ddinフレームワーク)
Pipeline AddIns CalcV1 CalcV2 AddInSideAdapters AddInViews Contracts HostSideAdapters
MEFとMAFの両方が.NETFramework4.xに含まれています。2つの例を比較すると、MAFプラグインはMEFフレームワークと比較してはるかに複雑であることがわかります。したがって、これらのフレームワークのどちらをいつ使用するかを慎重に検討する必要があります。
MAFとMEFはどちらもAppDomainsを使用でき、実行時にdllをロード/アンロードできます。ただし、私が見つけた違いは次のとおりです。MAFアドインは分離され、MEFコンポーネントは緩く結合されています。MAFは「アクティブ化」(新しいインスタンス)しますが、MEFはデフォルトでインスタンスを作成します。
MEFを使用すると、Genericsを使用して任意の契約のGenericHostを作成できます。これは、MEFのロード/アンロードとコンポーネント管理を共通のライブラリに入れて、一般的に使用できることを意味します。