2012-03-21 50 views
2

我正在構建一個描述爲「一個Web上的shell」的寵物軟件。我會做一個與API交流的shell,主要是爲了加強你在網絡上頻繁使用的所有任務。Web上下文中靜態類的生存期

我需要如何設計這個軟件在.NET 4(C#)的幫助。

我在開始和軟件被分成3個DLL:a UI - >連接器 - >命令[]。 (是不是3 DLL因爲每個命令是在一個單獨的DLL)

UI執行,這是在使用連接器項目其具有一個命令項目實現接口另一個的.dll的命令。使用反射(在UI)我執行該接口的實現,所以所有命令都是獨立的,並與主項目分開。

在這種連接器項目中有一個名爲殼牌是將輸出發送到UI推動者類型。因此,當某人正在構建命令時,他將發送文本或其他內容,例如使用.Net框架的System.Console

我真的想保持這個SHELL類是靜態的,但是這個類有狀態,每個請求必須有一個獨立的狀態。所以,據我所知,一個靜態類將有一個應用程序池的生命週期。我是對的?

+1

ÿ你是對的。除非你知道你在做什麼,否則不要在Web場景中使用靜態對象。 – 2012-03-21 21:25:28

+0

你爲什麼要保持靜態? – UpTheCreek 2012-03-21 23:47:52

+0

@UpTheCreek表現爲.Net框架的System.Console。 – 2012-03-22 00:47:13

回答

1

如果您認識到Shell必須具有狀態,那麼它不應該是靜態的。無論它是一個控制檯應用程序還是一個Web應用程序。有一件事是,你可以在一個線程應用程序中安全地使用它,你知道其他人不會使用你的類,但是非常不同的是,這是一個很好的設計。

如果您的類具有某種需要爲許多函數和所有實例共享的配置,則可以爲該數據聲明靜態屬性或字段。但是對於不同的線程,需要不同的數據必須是非靜態的。另外,在一個多線程的環境中,就像一個網絡應用程序一樣,你必須設計你的類來保證線程安全,否則你會遇到麻煩。如果你有一個擁有靜態方法但不是靜態數據的類,那麼你不必擔心線程安全性。

只要你的靜態類的「預期壽命」在一個Web應用程序中,它就會經受多次請求,但請記住,Web服務器的主線程將不時自動重啓(取決於IIS配置),這樣你就不能相信靜態成員保持數據「永遠」。您應該在Application Start事件中設置您的靜態數據,並且應該將更改後的數據存儲在永久存儲庫(通常是數據庫)中,以確保在應用程序重新啓動後可以恢復它。

所以你最好改變你的課堂設計。這不應該假設您的控制檯應用程序做了很多更改(除了使用更多的新功能外)。

1

您是否考慮過使用Inversion of Control (IoC)框架。大多數框架都有一個生活方式的概念,其中的例子可能是短暫的,在超出範圍之後被刪除,或者是隻有一個實例被創建的單例。

如果應用程序池被回收或重新啓動,您仍然需要保留應保留的所有數據。

靜態類也讓單元測試變得更加困難。

國際奧委會的注意事項: