MEFが、アプリケーションフレームワークがとるべき適切な方向であるかどうかを判断しようとしています。MEFを読んだところ、私たちのフレームワークは「正確に」適合していないようですが、専門家が私を導いてくれるかどうかを確認します。
私たちのフレームワークでは、1つのコアWebサイトと依存アセンブリを1つの場所にデプロイでき(修正または機能はすべてのクライアントに伝達されます)、コアWebサイトに「マージ」して必要に応じて拡張するクライアントWebサイトがあります。
現在IISでは、各クライアントサイトは、独自のAppDomainで実行される独自のアプリケーションです。ただし、すべてのアプリケーションには、「コアWebサイト」を指す同じ物理パスがあります。
したがって、ファイル構造は...
- / CoreSite
- / bin(コアサイトと依存関係のdllを含む)
- / [コアサイトフォルダ](例:モデル、ビュー、コントローラ、コンテンツなど)
- /クライアント
- / _Assemblies(すべてのクライアントアセンブリを含む-数百のクライアント)
- / Client1
- / [クライアントサイトフォルダー](モデル、ビュー、コントローラーなど)
- / Client2
- / [クライアントサイトフォルダー](モデル、ビュー、コントローラーなど)
- / ClientN
ご想像のとおり、アセンブリのロードが問題です。いくつかの理由から、すべてのクライアントアセンブリをルート/binフォルダーに配置したくありませんでした。まず、各クライアントサイトに他のすべてのクライアントアセンブリをロードさせたくありませんでした。次に、別のクライアントのアセンブリが/ binフォルダーで更新されたという理由だけで、すべてのサイトのAppDomainがリサイクルされることを望んでいませんでした。
これをasp.net1.1で機能させるために、http: //www.hanselman.com/blog/MovingTheCodeBehindAssembliesDLLsToADifferentFolderThanBINWithASPNET11.aspxに従い、web.configに<probing privatePath = "bin; Clients /_Assemblies"/>要素を追加しました。クライアントサイトの各ビューに<%@ Assembly Name = "ClientN"%>ディレクティブを使用します。克服しなければならなかった他の唯一の問題はクライアントアセンブリの更新でしたが、asp.net1.1は/Clients/_Assembliesディレクトリ内のアセンブリをロックしていました。単に追加しました:
if ( Directory.Exists( assembliesDir ) && AppDomain.CurrentDomain.SetupInformation.ShadowCopyDirectories.IndexOf( assembliesDir ) < 0 )
{
AppDomain.CurrentDomain.SetShadowCopyPath( AppDomain.CurrentDomain.SetupInformation.ShadowCopyDirectories + ";" + assembliesDir );
}
そしてビオラ、すべてが魅力のように機能しているように見えました。残念ながら、asp.net 4.0では、AppDomain.CurrentDomain.SetShadowCopyPath()は非推奨になりました。そのため、バイト配列からアセンブリを自分でロードしようとしたり、AssemblyResolveイベントを使用したり、[アセンブリ:PreApplicationStartMethod(typeof(MvcApplication)、 "PreApplicationStart")]をいじったり、Systemを使用したりしました。 Replication.BuildManager.AddReferencedAssemblyは役に立ちません。
次のいずれかを取得します。-アセンブリがロードされていない-アセンブリが多すぎる、または-アセンブリがロードされているが、ビューがレンダリングされているときに、名前空間が<%@ Assembly Name="ClientN"から配置されているはずの<Import/>ディレクティブに遭遇した場合%>は単に失敗します。
だから私は、MEFが進むべき道であるかどうかについてのメカニズムやアドバイスを使った提案を求めています。私の1000フィートの見方では、MEFは、複数のコンポーネントがプラグインされている1つのアプリケーション(またはWebサイト)を対象としています。私たちの状況では、アプリケーション/アプリドメインごとに一度に1つのコンポーネントしかプラグインできないため、メジャーコードリファクタリングを開始することを躊躇しています(そう思われます)。また、必要以上のことを実行しているようです(アセンブリをロードして、asp.netに認識させるだけで、すべてのコードが機能します)。
アドバイスをいただければ幸いです。