4

私はここで本当の頭をかきむしります...そしてそれはASP.NETのより苛立たしいトピックの1つであるように見えます。

たくさんのカスタムLinqのものを実装するアセンブリがありますが、そのコアにはWeb機能がありません。このアセンブリをWeb固有の動作で拡張する追加のアセンブリがあります。

Web固有の動作には、ASCXテンプレート化されたUserControls内にマークアップされたいくつかのユーザーコントロールが付属しています。

他のアプリケーションで使用するために再デプロイするのが簡単になるように、このアセンブリをきれいに仕上げるのに問題があります。これまでに試したことを実行してみましょう。

  1. ビルドイベントを使用して、ASCXファイルを消費側のWebアプリケーションにコピーしました。理想からはほど遠い、展開の悪夢です。
    • カスタムVirtualPathProviderを実装し、ASCXテンプレートを埋め込みリソースとしてアセンブリ内に埋め込みました。残念ながら、使用するアプリケーションでRegisterディレクティブを使用すると、デザイナー宣言がUserControlとして作成され、実際のコントロールタイプの宣言が必要になります。予期しない(通常)および望ましくない
    • UserControlsをコンパイルするためのWeb配置プロジェクトを作成しましたが、コンパイルされたユーザーコントロールは別のアセンブリの一部になり、Webアセンブリのクラス定義から派生しなくなりました。アセンブリはリクエストコンテキストに応じてそれらをインスタンス化する必要があります

つまり、1番はただのがらくたであり、2番は私が望むタイプのサポートを提供せず、3番は次のような合理的な解決策を生み出そうとしていると思います。

  • すべての非制御クラスをApp_Codeフォルダーにまとめ、リフレクションを使用して目的の制御タイプのオブジェクトを構築するファクトリクラスを準備し、反映されるタイプがデプロイメント出力に存在することを期待します(ClassName属性の存在によって保証されることを願っています)Controlディレクティブ内)。

ASCXコントロールをカスタムコントロールに書き換える他のオプションも常にありますが、現時点でそれを検討するためのリソースがなく、それを行うための専門知識がなく、UserControlとして正常に機能します。

明らかなもの、おそらくもっと単純なものが欠けているのでしょうか、それとも意図的に難しいのでしょうか?ASP.NETのコンパイルプロセスの話を読んだことがありますが、このトピックを旅する際の設計は非常に残念です。

4

1 に答える 1

2

さて、私はそれをやったと思います...私の最後のアプローチでいくつかの厄介な落とし穴のいくつかに注意することによって、Web展開プロジェクトを使用してWebアプリケーションプロジェクトでASCXユーザーコントロールをコンパイルするときに次のことをお勧めします。

  1. App_Codeスタンドアロンクラスまたはヘルパークラスでない限り、クラスを配置しないでください。ASP.NETは、これをspeshulフォルダーとして扱います。その意味は私には失われ、騒乱、混乱、混乱が続きます。ただし、このフォルダー内のコードは、Web配置プロジェクトで出力されます。
    • アセンブリ名、それらのルート名前空間、およびデプロイメント出力アセンブリ名に細心の注意を払ってください。プロセスaccess is denied中に名前の競合があると、エラーが発生しaspnet_mergeます。
    • 最終的には、2つのアセンブリをデプロイすることになります。私は、1つだけを作成しようとしましたが、デプロイメントの出力は、ソースアセンブリの型定義を指していました。Webアプリケーションプロジェクトに他のタイプがない場合、これは問題ではありません。私にとっては問題でした。私の場合、最終的な出力は次のとおりです。
    • <Organisation>.<TechnologyName>.Web.DLL-コンパイルされたWebアプリケーションアセンブリ(ASCXテンプレートを含む)
    • <Organisation>.<TechnologyName>.Web.UI.DLL-Web配置プロジェクトによって作成されたASP.NETコンパイル済みUserControlアセンブリ
    • 頻繁にクリーンアップし、名前空間またはアセンブリの命名スキームを完成させていない可能性があるときに構築された以前のジャンクがWebアプリケーションプロジェクトbinとパスから削除されていることを確認します。Webデプロイメントプロジェクトはこれらを含めることに非常に熱心であり、細かい混乱を引き起こします。 obj
    • Importインポートされた名前空間を確認します。ASP.NETコンパイラはASCXテンプレートのディレクティブを参照するのが好きで、web.config<configuration><system.web><pages><namespaces>要素に存在するインポートされた名前空間も考慮します。展開プロセス中に不明な定義が表示される場合は微調整します。

ある程度の忍耐力を持ってください、それはかなりトリッキーです!しかし、あなたはそれの終わりにいくつかの素晴らしい再配布可能なUserControlsを手に入れます!

ふぅ!

于 2009-06-18T10:04:13.523 に答える