2010-04-15 50 views
2
class UserDatastore : IUserDatastore 
{ 
    ... 

    public IUser this[Guid userId] 
    { 
     get 
     { 
      User user = (from u in _dataContext.Users 
          where u.Id == userId 
          select u).FirstOrDefault(); 

      return user; 
     } 
    } 

    ... 
} 

一個在我們的團隊開發人員爭辯說,在上述情況下的索引是不恰當的,並且一個GetUser(Guid id)方法應優先。使用索引從數據存儲檢索的LINQ to SQL對象

的論據在於:

1)我們不是索引到內存中的集合,索引基本上是執行一個隱藏的SQL查詢 2)在索引使用GUID是壞的(標記的FxCop這也) 3)從分度器返回null不正常行爲 4)的API用戶通常不希望任何的這種行爲

我同意的程度與(大部分)這些點。

但我也傾向於認爲,Linq的特點之一是抽象數據庫訪問,使它看起來你只是在處理一堆集合,儘管懶惰的評估範例意味着那些集合直到您對它們運行查詢纔會被評估。我以同樣的方式訪問數據存儲區似乎並不矛盾,就好像它是一個具體的內存中的集合。

還要記住,這是一個廣泛而一致地使用這種模式的繼承代碼庫,值得重構嗎?我承認從一開始就使用Get方法可能會更好,但我還不確定使用索引器是完全不正確的。

我很想聽聽所有的意見,謝謝。

回答

0

我傾向於同意您的團隊開發人員所建議的幾乎所有內容,除了Guid部分。如果這裏有任何問題,它必須在考慮性能的數據庫級別上,而不是在代碼中。

就我個人而言,我認爲屬性和索引器不應該隱藏long運行操作,儘管Users可以通過LINQ到SQL進行緩存。這就是爲什麼我會更喜歡一種方法。

我也同意從索引器返回null是不好的。改爲拋出異常。

+0

- 由於連接已經建立,數據庫查詢可能不會像內存查詢一樣快嗎? – fearofawhackplanet 2010-04-15 13:00:36

0

我認爲他關於使用GUID作爲索引器的觀點可能是指它存儲在數據庫中。使用整數作爲鍵將提供更好的性能,並且佔用比使用GUID更少的存儲空間。

如果索引(鍵)不在集合中,您將拋出異常,而返回null與索引器通常非常不常見。

就我個人而言,我並不是真的在這裏看到這個問題,它幾乎相當於有一個GetUser方法。我的意思是如果你想整理一下,你實際上可以引入一個叫做GetUser的私有方法,索引器可以調用例如

public IUser this[Guid userId] 
{ 
    get { return GetUser(userId); } 
} 

private IUser GetUser(Guid userId) 
{ 
    return (from u in _dataContext.Users 
      where u.Id == userId 
      select u).FirstOrDefault(); 
} 

從外觀設計上來看來看,我個人也不會使用索引,我會去用GetUser方法。

+0

感謝您的意見。我沒有看到你所建議的重構有任何好處,當然,要麼保持原樣,要麼完全移除索引器。你正在改變內部或外部行爲。除非我錯過了這一點。 – fearofawhackplanet 2010-04-15 11:11:36

+0

@fearofawhackplanet:如果你閱讀我發佈的內容,我說*如果你想整理*。唯一的好處是可維護性和更乾淨的代碼。我通常不喜歡在getter中放入那麼多代碼。關於長時間運行操作的 – James 2010-04-15 11:23:05