2012-04-09 89 views
1

我正在一個便攜式區域內執行一項操作,該區域需要獲取有關調用它的Assembly的信息。便攜式區域位於項目Core中,由客戶端應用程序Client引用。在便攜式區域獲取呼叫/客戶端組件

GetAssemblyGetExecutingAssembly都返回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程序集的參考。顯然,我可以使用一些花哨的依賴注入或其他一些不太複雜的方法來獲取這些信息。不過,我想知道是否有更好的內置方式來做到這一點。

澄清:我想要得到的是客戶端程序集的版本信息。我希望每個客戶都可以訪問位於Core區域的VersionInfo部分,並將構建版本信息添加到呈現的頁面。所以,Core中的動作需要知道調用它的程序集,以便它可以反映版本信息。

+1

你能提供一些上下文嗎?便攜式區域需要使用它的組件的哪些信息? DI/IoC聽起來像迄今爲止最好的解決方案,但它不一定是「幻想」。 – danludwig 2012-04-09 20:39:56

+0

增加了一個說明 - 我同意DI聽起來不像是一個可怕的解決方案;我只是希望有一些神奇的東西已經建成。 – eouw0o83hf 2012-04-09 20:56:27

回答

0

經過很多努力和很多的眼淚,我已經確定DI將是最好的方式來做到這一點。爲什麼?

一些信息在便攜式領域
一些研究和觀察之後,似乎便攜領域MVC自己的子實例中運行。我試圖從我的便攜式區域稱之爲局部視圖住在我的客戶端應用程序的視圖:

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

如果我拿出一個堆棧跟蹤在CoreVersion行動,我得到:

核心.Versions()
在System.Web.Mvc ...
在System.Web.Mvc ...
在ASP._Page_Views_Shared_Layouts__Base_cshtml.Execute()
在System.Web.Mvc ... at ...

由於我的客戶端應用程序中的所有控制器代碼已經執行,所以甚至不再在堆棧跟蹤中引用該程序集。我還試圖加入Assembly ARG到Versions動作,LA:

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

但從結果是App_Web_xq4cmhcy,顯然生成的組件。

所以,真的剩下的唯一選擇就是添加一個DI容器,它在Global中被初始化。每個客戶端應用程序的asax與正在執行的程序集,然後可以通過Core方法讀取。