2012-05-26 271 views
5

我目前正在開發一個C#MVC REST web api,並試圖在我們設計的兩種可能性中選擇一種。C#靜態方法vs對象實例

沒有太深入我們的設計,我們打算有一個數據訪問類,我們將其稱爲DataSource。每個DataSource將需要執行小的,包含的邏輯塊來正確地建立適當的響應。由於希望能夠在將來熱載入代碼,我們不希望在DataSource上簡單地使用這些函數,而是希望它們由其他程序集提供。我們有這個實施的概念證明,到目前爲止,這是非常好的。

我想要決定的是用一個靜態函數寫一個靜態類,或者編寫一個工廠方法來創建這些類的實例,它們有一個實例方法,稱爲ExecuteQuery

爲每個請求創建多個短期對象與調用靜態方法之間的性能考慮因素是什麼?

直觀地說,靜態方法會更快,但我已經期待我會遇到一些頭痛的問題,通過反射來調用它們(以支持熱載代碼要求)。

如果對短期對象沒有巨大的懲罰,那麼他們可能僅憑簡單就贏得勝利。

我們期望的負載相關信息:在300ms以內

  • 響應時間 - 800毫秒範圍
  • 約2000 Web客戶端的約4000客戶
  • 客戶做查詢
  • 高峯負荷平均負載每2 - 5秒
  • 客戶端每秒查詢1次峯值速率

此外,每個DataSource將創建最多8個,其中3個平均值爲這些實例。

+0

可能你的意圖使用反射將導致比靜態與實例使用更大的性能影響。正如其他人所評論的那樣,你應該選擇使設計意義最大的形式。另外,由於你有一些預期的指標,你可以嘲笑一個靜態/實例實現,並瞭解你將面臨的開銷。 –

回答

1

使用一個靜態類,它將調用委託給實現類。

這些實現類應該實現一個通用接口,它將允許您在不需要反射的情況下調用它們上的方法。當然,靜態方法不能實現接口方法。接口實現必須是實例,你需要某種工廠來實例化它們。如果他們生活在外部程序集中,我強烈建議您查看託管擴展性框架(MEF),請參閱http://msdn.microsoft.com/en-us/library/dd460648.aspx

爲每個請求創建多個短期對象與調用靜態方法之間的性能考慮因素是什麼?考慮到這些方法可以訪問數據,性能影響完全可以忽略不計。

如果您使用MEF,框架將爲您創建類似於單例的實例。

如果您是自己的角色,並且想要多次刪除創建這些對象的需要,則可以在其上實現Singleton模式。

+0

我曾經在他們身上使用Singleton模式進行過辯論,但還沒有做出任何決定。 我認爲MEF就是我正在尋找的東西。謝謝! –

0

主要決定應該是「這個物體有狀態嗎?」

如果「否」,那麼通過一切手段,使其成爲一種靜態方法。

恕我直言.. PSM

+0

不幸的是,對所有可能的對象的要求還沒有完成,所以雖然我不認爲它們會有狀態,但在這個階段我不能100%確定。 –

1

我認爲每個DataSource實例將使到數據庫的新連接。如果是這樣,那麼只有一個實例纔有意義。要找出「這是一個巨大的懲罰」的唯一方法是創建一個解決方案和配置文件的模型,看看它的影響是否顯着。

  • 既然你似乎沒有一次有很多客戶,所以這也是 將與單身模式。
  • 併發查詢並不多(主要是因爲上述語句)。
  • 您有一個已定義的響應時間規範。

我可以爲工廠模式做的唯一參數是「簡單」。如果項目真的是時間敏感的,那麼我猜你別無選擇。但是如果你真的想要表現的話,那麼去Singleton吧。

1

使用MEF。無需發明自己的插件框架。它會引導你使用通過接口暴露的實例方法。創建每個請求對象並不罕見... MVC框架可以完成這一切。每個請求實例對於數據訪問方案來說是一件特別好的事情,所以您可以支持事務/回滾之類的事情,方式是一個用戶的體驗不會影響其他用戶,直到您明確地實現它爲止。如果perf是一個問題,在適當的地方使用響應緩存。

+0

這是一個非常好的觀點,我沒有想到,MVC必須在每個請求的基礎上製作多個對象。我肯定會研究MEF,因爲它現在已經提到了兩次,而且匆匆一瞥,它看起來正是我想要的。 –