2009-06-02 32 views
1

このサイトのアドバイスに基づいて、ASP MVCアプリケーション用のプラグインソリューションを作成しましたが、ロードブロッキングに達しました。プラグインシステムがどのように機能するかに関わらず、コントローラーを正常にロードして適切なビューを見つける - 問題は、プラグインのすべての参照を解決できないためにビューがコンパイルされないという問題です(プラグインDLLは、ホストアプリケーションが知らないDLL)。ASP MVCページコンパイルエンジンへの参照の追加

CurrentDomainでAssemblyResolveを使用していますが、デフォルトのBuildManagerがビューをコンパイルするときに呼び出されるのではなく、web.configセクションからアセンブリのリストを取得します。すべてのプラグインファイルをGACに追加し、そのセクションに参照を追加するとうまくいきます。しかし、プラグインごとにweb.configを変更する必要がある場合は、プラグインシステムを導入するという目的を破ることになります。

少しイラストの問題を説明する: Plugin.dll --references - > PluginServices.dll

URL http://mysite.com/some/index MVCアプリケーション--load - > Plugin.dll PASS

MVCアプリケーションを--load - > Plugin.SomeController PASS

MVCアプリケーション--find - >プラグイン\ビュー\一部\ Index.aspx PASS

MVCアプリケーション--compile - > Index.aspx FAIL(目eビューは見つからないPluginServicesのタイプを使用します)

Web.configを変更せずにコンパイルが成功するように、BuildManagerへの参照を動的に追加する方法はありますか?

ありがとうございます!

答えて

0

再び

C#のリフレクションと動的メソッド呼び出し、直接ロジックをロードの一部が正常に動作しても景色の場所をされ、機能していない唯一の部分は、私がノーを持っている部分でありますコントロールオーバー - ページの実際のレンダリングです。

しかし、私はそれを動作させることができました。私は何をしなければならなかったことは以下の通りである。 1)は、プラグインDLLのGAC

2)「コンパイル」の下にDLLのホストのweb.configファイルへの参照を追加して登録のセクションを持って

3)プラグインのすべてのビューが '継承'属性を使用してビューを強く入力しないようにしてください。代わりに、ローカル変数を作成し、モデルを適切な型にキャストします。

これはすべて今のところうまくいくようですが、私はもっと良い解決策を見つけることができるかどうか考えていきます。

また、どのようにMVCのプラグインシステムを持っていて、view.aspxのような行を持っていないのかを誰がどのように主張できるのか分かりません。<%= Model.Name%> Modelはオブジェクトですホストが知っていること。

ご回答いただきありがとうございます。

+0

それはかなりクールなアイデアのように聞こえる。あなたはどうしてそれが気に入らないのですか? –

+0

唯一の理由は、GACのファイルを更新し続ける必要があるため、少し面倒です。それ以外は、うまくいくようです。 – Gil

0

基本アプリケーションに入れることができるいくつかのインタフェースまたは抽象クラス(好ましくはインタフェース)の作成について考える必要があります。そのため、プラグインが存在しない場合でも基本アプリケーションはコンパイルされます。その後、プラグインにインターフェイスまたはベースクラスの実装を記述します。

This articleあなたが始めます。

+0

ASPが実際にページをレンダリングして参照を解決しようとしているときに問題が発生しているため、返信いただきありがとうございますが、関連するDLLは見つかりません。 – Gil

+0

プラグインのインターフェイスの実装を利用できない場合(たとえスタブまたは単体テストのモックであっても)、アプリケーションを実行するにはどうしたらいいですか? –

+0

実装は、実行時にプラグインに配信される別のアセンブリです。プラグインは、それが使用しているオブジェクトのインタフェースと実行時に実際のオブジェクトを持つサービスレイヤのサブコンポーネントについてのみ知っています。問題は、ホストアプリケーションがプラグインのビューをレンダリングするときに、インターフェース名を解決できないことです。 – Gil

0

私はあなたのホストプロジェクトがプラグインDLLをコンパイルしていないと思うと思います。私はプラグインを事前に構築しておき、おそらくアセンブリのdllにビューを埋め込むことを望んでいると思います - この方法では、適切なインターフェース[Robert Harvey et al]を作成して、ホストアプリケーションが動的にロードされるアセンブリは大丈夫です。プラグインを開発/コンパイルする際にプラグインをテストするプラグインハーネスソリューションを作成する必要があります。ビューのコンパイルエラーが表示されない(this postもビューのコンパイラエラーに役立つはずですが、それは私のために働いた)。

+0

これは有望に見えましたが、いずれもうまくいきます。私はすべてのビューをあらかじめコンパイルし、ホストと同じフォルダにあることを確認しましたが、それでも参照を解決できませんでした。 ASP MVC用のプラグインデザインがあると主張している投稿がたくさんありますが、ホストに知られていないビジネスレイヤへの参照を持つ実世界のビューでは動作していません応用。 – Gil

0

ギル、

次の記事をご覧ください。 Reflectionを使用して実行時にビジネス層アセンブリに関する情報を取得し、InvokeMemberを使用して目的のメソッドを呼び出す方法について説明します。働くにはどんな種類の登録も必要ありません。あなたはアセンブリへのパスが必要です。
http://my.execpc.com/~gopalan/dotnet/reflection.html

関連する問題