簡體   English   中英

如何創建一個在ASP.NET和非ASP.NET應用程序中工作的類庫?

[英]How do I make a class library that works in ASP.NET and non-ASP.NET applications?

我想編寫一個在ASP.NET和獨立應用程序中工作的類庫。 在ASP.NET下運行時,需要在行為上有一些差異。 檢查庫是否在ASP.NET應用程序中運行的推薦方法是什么?

我可以檢查HttpContext.Current ,因為它似乎在不在ASP.NET下運行時可靠地返回null。 但是,當在ASP.NET中的后台線程上運行時,它也返回null。

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

補充:感謝關於如何實現關注點分離的所有建議。 但是,我想補充一點,這個庫不會用於通用目的,所以對於我的特殊情況我不需要很大的靈活性。 在我看來,到目前為止最好的(在這個線程中沒有提到)是檢查HttpRuntime.AppDomainAppId靜態為null,因為它似乎工作正常,即使對於ASP.NET后台線程。 但是,這里提供的各種解決方案肯定會對有更多一般需求的其他人有所幫助。

我會將ASP.NET和桌面應用程序共有的所有代碼推送到核心庫並對其進行測試,然后創建位於核心應用程序之上的庫以提供部署細節 - 例如,您的HttpContext調用。 然后,您可以在兩種情況下都可靠地進行測試,因為您只需要測試一次核心應用程序塊。

關於從后台線程檢查HttpContext - 這沒有意義,並且將始終返回null,因為HttpContext是由asp.net請求處理器定義的。 如果您的代碼啟動后台線程,則新線程中的HttpContext將為null。 對於那個很抱歉 :)

作為一種解決方法,您可以嘗試將每個新會話添加到全局集合,然后從后台線程調用該集合。 您需要注意同步對會話集合的訪問權限。

我認為將UI代碼與應用程序邏輯分開是很常見的。

我會將所有應用程序邏輯放入共享庫中。 根據需要從庫中提升事件。 然后,您可以在任何您喜歡的應用程序Asp.Net,WPF等處理這些事件。

如果您的應用程序需要可能在HttpContext中的內容,例如session,則應將這些變量作為參數傳遞給您的方法,以便庫不依賴於HttpContext。

您可以采取的一種方法是將Web和非Web應用程序之間的行為分解為具有公共接口(即IPlatform )的類,然后使用IOC容器或依賴注入來配置應用程序以使用正確的IPlatform實現。 但是,根據您的需要,這可能會過度工程化。 您可能希望在平台之間添加您想要改變的特定行為。

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

當你不真正需要它時訪問HttpContext,以及在所有情況下都沒有正常工作(正如你所發現的那樣),正在讓這個類太多地回到它的環境中。 讓它簡單地執行它的工作,讓調用代碼告訴它使用哪組邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM