1

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に認識させるだけで、すべてのコードが機能します)。

アドバイスをいただければ幸いです。

4

2 に答える 2

0

アセンブリを含むすべてのフォルダーに対してシャドウ コピーを有効にする方法を理解する必要があるようです。使用していた方法が廃止された理由は、AppDomain が作成される前にこれを設定する必要があるためです。したがって、これを有効にするには、おそらく web.config で設定する必要があるものがあると思います。

MEF はアプリケーションに適しているかどうかはわかりませんが、シャドウ コピーの問題は解決しません。

于 2010-07-08T01:16:24.907 に答える
0

ドキュメントによると、動作は .NET 2.0 から変更されました。プローブによって検出されたすべてのアセンブリ (プライベート パスを含む) は、自動的にシャドウ コピーの対象となり (アプリ ドメインに対して有効になっているため)、SetShadowCopyPathメソッドには逆の目的があります。つまり、シャドウ コピー パスを狭めます。

既定では、シャドウ コピーには、プローブによって見つかったすべてのアセンブリが含まれます。SetShadowCopyPathメソッドは、パスで指定されたディレクトリ内のアセンブリにシャドウ コピーを制限します。

SetShadowCopyPathメソッドは、アセンブリを検索する追加のディレクトリを指定しません。シャドウ コピーするアセンブリは、 BaseDirectoryなどの検索パスに既に配置されている必要があります。SetShadowCopyPathメソッドは、シャドウ コピーの対象となる検索パスを指定します。

于 2011-07-15T13:02:54.297 に答える