2012-02-17 8 views
0

私は現在、a)開発者がウェブサイト用のプラグインを開発でき、ユーザーが自分のアカウントで必要なプラグインを選ぶことができるように、MEFでMVC Webアプリケーションを開発中です。これは、アプリケーションが既に起動し、ユーザーがログインした後に(プラグインのアセンブリを取得して現在のカタログに追加する)データベースに移動した後に、自分の構成の一部が発生しなければならないことを意味します。実行時にMEFカタログを更新する

私は、データベースに保存しているユーザライブラリに、AssemblyCatalogにログインする際にログインして、自分の既存のAggregateCatalogに正常に追加できるライブラリをいくつか持っています。しかし、私の図書館では、IController契約がエクスポートされていないため、その特定のウィジェットが破損しています。私は起動後にMEFに再構成を強制する方法については完全にはわかりません。私は誰かが私のためにいくつかのアドバイスを持っていることを願って、ここに投稿しています。

私のコードはexcellent blog series by Matt Abbottをオフに基づいているので、私は一種の彼が同様にいくつかのアドバイスでチャイムだろうことを願っています。

+0

リンクを修正してくれてありがとう、Lester。 :) とても有難い。 –

答えて

1

さて、あなただけのいずれかをお使いのクライアントシステムに部品を識別するためのメタデータの組み合わせでLazyまたはExportFactoryを通じて、(クライアントはそれらが有効になっているにかかわらず、そのうちの)すべての利用可能な部品をロードしますが、遅延インスタンス化を使用することができませんでしたか?このように、必要に応じてアセンブリをロードする必要はなく、すぐに準備が整います。

データベースからアセンブリを動的に読み込み、AppDomainにロードする場合は、おそらく新しいAssemblyCatalogにまとめても構いませんが、再構成を利用できます。

たとえば、その初期バージョンでは、を使用していましたが、近づいてリリースになりました(しかし、最終的な.NET 4.0には含まれていません)。あなたは[ImportMany][ImportMany(AllowRecomposition = true)]に、次の時間を変更する場合は、PartCreatorExportFactory)インスタンスの[ImportMany]セットを再構成する必要があり、新しいカタログ、例えば:

((AggregateCatalog)container.Catalog).Catalogs.Add(<assembly>); 

を追加します。

それがうまくいくならば、私はそれがか働かないだろうと言うことができる前に...私は...あなたの意図したアーキテクチャを理解するためにもかかわらず、私は答えとしてこれを入力するよ

+0

こんにちは、マシュー!基本的には、ブログシリーズのパート3でリンクされたコードのバージョンを使用していますが、大きな変更はありません。私はすべてのプラグイン/ウィジェットを読み込むことができますが、このサイトの計画では、すべてのクライアントに数百のアセンブリがロードされている可能性があります。だから私は実行時にオンデマンドでロードされています。 私はAllowRecomposition属性を試していないので、私はそれにスピンを与えて、どうなるか見てみましょう。 :) お返事をありがとうございます! –

+0

AllowRecompositionは、起動後にロードされたアセンブリに対して動作しているようですが、これらのアセンブリの1つにImportControllerFactoryで再構成されないようなIControllerエクスポートがあることを除いて、コントローラ/アクションに対する要求は失敗します。私は見ていくつかのコードを送って喜んで、それはクールだろうか? –

0

を、必要があると思いわかりませんそれは本当の答えではなく、もっと結論です。私の問題はこれでした。アプリ起動時にMEFのすべての構成を行っていて、ログインした後にユーザー別にすべてを分けようとしていました。

実際には、すべてを延期する必要があります。ユーザーが最初にログインするようにしてから、ユーザーが「インストール済み」(データベースからアセンブリを引き出すなど)に基づいてすべてのMEFコンポジションを実行し、そのコンポジションコンテナをセッションまたはその他のストレージメカニズムに格納します(したがって、ページ、ウィジェットなどを構築するために必要に応じて)、私は金色です。私の元の問題は丸い穴に四角いペグを合わせようとしたことから生じました。私の構図は、ログインするまで起きる必要はなく、起動する必要はありません。私は私のアプリでDIをするのにMEFを使うかもしれませんが、それはユーザーの構成とは別です。

私は本当に楽しみにこのアプリケーションをプッシュする助けMEFおよびMVCの彼の優れたシリーズ、のためにマシュー・アボットに感謝し、再び、しかし、この瞬間がかかります。私は彼の答えを返信にしなかったが、私は彼にもっと評判を与えるのを助けるためにそれをアップヴォートした。

関連する問題