2009-12-22 46 views
2

我想寫一個適用於ASP.NET和獨立應用程序的類庫。在ASP.NET下運行時,需要一些行爲差異。推薦的方法是檢查庫是否在ASP.NET應用程序中運行?如何製作適用於ASP.NET和非ASP.NET應用程序的類庫?

我可以檢查HttpContext.Current,因爲它似乎可靠地返回null時,ASP.NET下沒有運行。但是,在ASP.NET中的後臺線程上運行時,它也會返回null。

關於HttpContext.Current或其他解決方案的任何意見?

添加:感謝您提供關於如何實現問題分離的所有建議。不過,我想補充一點,這個庫不會用於通用目的,所以對於我的特殊情況我不需要很大的靈活性。在我看來,迄今爲止最好的(在此線程中未提及)是檢查HttpRuntime.AppDomainAppId靜態爲null,因爲即使對於ASP.NET後臺線程,它似乎也能正常工作。但是,這裏提供的各種解決方案肯定會對其他有更多普遍需求的人有所幫助。

+0

將所有客戶端託管代碼? – 2009-12-23 00:00:28

+0

<是否所有的客戶端都是託管代碼?>是的。 – 2009-12-23 00:44:28

回答

7

我將推動所有常見的ASP.NET和桌面應用程序的代碼轉換成核心庫和測試,然後創建一個坐的核心應用程序之上,提供部署細節庫 - 你的HttpContext要求的例子。然後可以在兩種情況下可靠地進行測試,因爲您只需測試一次核心應用程序塊即可。

至於從後臺線程檢查HttpContext的 - 這是沒有意義的,將永遠返回null,因爲HttpContext的是由asp.net請求處理器定義。如果您的代碼啓動後臺線程,則HttpContext將在新線程中爲空。對不起,關於:)

作爲一項工作,你可以嘗試將每個新的會話添加到全局集合 ,然後從後臺線程調用集合。雖然你需要小心同步訪問會話集合..雖然..

+0

爲了澄清,問題關於如何在運行時實際執行檢查,而不是如何進行軟件測試。我在原文中將「測試」改爲「檢查」,以避免混淆。 – 2009-12-22 23:59:50

+0

好的,這裏的語義很重要:) – flesh 2009-12-23 00:00:49

3

我認爲這是相當普遍的分開你的UI代碼從你的應用程序邏輯。

我會把所有的應用程序邏輯放到共享庫中。酌情從庫中提起事件。然後,你可以在任何你想要的Asp.Net,WPF等應用程序中處理這些事件。

如果你的應用程序需要可能在HttpContext中的東西,比如session,你應該把這些變量作爲參數傳遞給你的方法所以庫不依賴於HttpContext。

+0

我想這是靜態確定的。在我的文章中,我討論了一個正確的解決方案就是將設置添加到app.config/web.config。但謝謝你的想法! – 2009-12-23 00:20:11

0

爲什麼不相反,有一個公共屬性,調用代碼可以設置告訴你的類的實例,他們是否應該使用他們打算用於ASP.NET的邏輯?

訪問HttpContext的,當你不真的需要它,右在所有情況下不工作(如你發現)一起,給該類太多到達回到它的環境。讓它簡單地執行它的工作,並讓調用代碼告訴它要使用哪一組邏輯。

+0

每次創建實例時都要設置它比我想要的要多。我想過一個靜態屬性,但與其他選項相比,這不是「成功」。 – 2009-12-23 00:46:08

+0

如果使用靜態屬性,則可以在global.asax文件中進行設置,該屬性應該爲在同一AppDomain中的所有線程中創建的所有實例提供良好的標誌值。 – richardtallent 2009-12-26 04:55:20

3

您可以採取的一種方法是將Web和非Web應用程序之間的行爲分解爲具有通用接口的類(即IPlatform),然後使用IOC容器或依賴項注入來配置應用程序以使用適當的IP平臺實施。但是,這可能是過度工程,取決於您的需求。您可能希望在您的問題中添加您想要在不同平臺之間變化的具體行爲。

相關問題