2014-05-13 30 views
0

問題背景:正確使用共享靜態「隨機」單例實例?

目前,我有我的代碼一對夫婦的「隨機」一些情況 - 在這裏我需要一個隨機生成的數字追加到某些文件夾,我創建的名稱 - 在兩個班使用。一旦工作 - 在這種情況下將文件映射到這些新文件夾 - 完成後,它們會立即刪除。

代碼:

我在每一個提到的類下面的代碼的兩個私有靜態實例:

private static randomNo = new Random((int)DateTime.Now.Ticks); 

單身?還是兩個靜態實例?:

到目前爲止,我還沒有遇到任何重複問題。我仍然覺得我應該開發一個單例來在我的整個解決方案上共享一個靜態隨機數對象實例。

我正在使用IoC(Unity)來創建我所有的類,我不知道如何去處理共享靜態隨機實例?我可以在每個需要它的課程中「新建」單身課程嗎?或者這會導致靜態隨機實例重置?我是否需要創建一個單例類並在需要隨機生成的數字的類之間傳遞它?

我應該提到我確實有檢查以確保當使用附加的隨機數創建新文件夾名時,我確保名稱不存在。

+1

潛在的問題對我來說不是很清楚。你談論重複。你的意思是說不同的發電機可以產生相同的數字嗎?一個發電機也可以連續兩次產生相同的數字。 – GolezTrol

+0

@GolezTrol我想我想知道的是我可以堅持兩個私有靜態變量,因爲我現在有?或者,實施一個單身人士最好的做法是?我只是想知道是否需要在類之間傳遞一個Singleton實例? – user1352057

+1

你也可以通過一個單身人士。優點是你的應用程序不會嚴重依賴它是一個單例。如果你只是從你的應用程序的任何地方調用單例,那麼重構它將會有更多的工作。另一方面,你什麼時候需要改變它,以及將會有多少個電話... – GolezTrol

回答

1

在整個應用程序中,您並不嚴格需要使用一個Random單身人士。在大多數情況下(包括在這種情況下)使用多個實例是比「理論上的正確性」更喜歡方便的標誌,但是有不同的程序組件在設計中使用不同的RNG的合法情況,以便每個組件的行爲該程序的生命週期是確定性的。

如果你想要移動到你應該使用RegisterType指導,它應該滿足一個Random對象的所有請求具有相同背景的容器中的單一實例:

container.RegisterType<Random>(new ContainerControlledLifetimeManager()); 

這不會創建一個Random實例當場;相反,它將指示容器,一旦Random的請求已被解決,後續請求將使用同一實例解決。

之後,這只是一個解決單個實例與container.Resolve<Random>()或使容器可見的依賴關係的問題,以便它自動解析並注入RNG實例,當您指示它解決RNG的用戶之一。

+0

除非你有一個令人信服的理由去關注單向或者另一個,否則如果你的代碼中有一個或者10個RNG變量,它應該沒有區別。畢竟,它們都會產生均勻隨機分佈的隨機數。 做什麼是可維護性的最佳利益,你可能不會誤入歧途 –