1

Assemblyポータブルエリア内で実行されているアクションがあり、それを呼び出したエリアに関する情報を取得する必要があります。ポータブルエリアはプロジェクト内にCoreあり、クライアントアプリによって参照されますClient

GetAssemblyそして両方ともアセンブリをGetExecutingAssembly返します:Core

// Both are Core
assembly = Assembly.GetAssembly(GetType());
assembly = Assembly.GetExecutingAssembly();

私の次の考えは使用することでしたGetCallingAssembly、しかしそれは戻ってきますAnonymously Hosted DynamicMethods Assembly.

assembly = Assembly.GetCallingAssembly();

他の唯一のオプションはGetEntryAssembly、です。これはnullです。

assembly = Assembly.GetEntryAssembly();

私がやりたいのはClient、組み込みのフレームワークを使用してアセンブリへの参照を取得することです。明らかに、このアクションにその情報を取得するために、いくつかの派手な依存性注入または他のあまり洗練されていない方法を使用することができます。ただし、これを行うためのより良い組み込みの方法があるかどうか疑問に思っています。

明確化:ここで取得しようとしているのは、クライアントアセンブリのバージョン情報です。VersionInfo各クライアントがそのエリアに存在するパーシャルにアクセスしCore、レンダリングされたページにビルドバージョン情報を追加できるようにします。したがって、のアクションはCore、バージョン情報を反映できるように、それを呼び出したアセンブリを知る必要があります。

4

1 に答える 1

0

多くの努力と多くの涙の末、DI がこれを行うための最良の方法であると判断しました。なんで?

ポータブル領域に関する情報
いくつかの調査と観察の結果、ポータブル領域は MVC の独自のサブインスタンスで実行されているようです。ポータブル領域から部分ビューを呼び出そうとすると、クライアント アプリケーションのビューに存在します。

@Html.Action("Versions", "Core")

Versionのアクションでスタック トレースを引き出すと、次のCoreようになります。


System.Web.Mvcでの Core.Versions()... System.Web.Mvc で
...
ASP._Page_Views_Shared_Layouts__Base_cshtml.Execute()で
System.Web.Mvc... で ...

クライアント アプリケーションのすべてのコントローラー コードが既に実行されているため、スタック トレースにはそのアセンブリへの参照すらありません。また、アクションにAssembly引数を追加しようとしました。Versions

@Html.Action("Versions", "Core", new { assembly = Assembly.GetExecutingAssembly() })

しかし、その結果はApp_Web_xq4cmhcy、明らかに生成されたアセンブリです。

したがって、残された唯一のオプションは、実行中のアセンブリを使用してすべてのクライアント アプリケーションの Global.asax で初期化される DI コンテナーを追加することです。このコンテナーは、Core メソッドによって読み取ることができます。

于 2012-04-10T13:30:34.373 に答える