2009-01-10 178 views
4

審查Conery的店面,我不明白他爲什麼使用Linqs自動生成的類(即Order類),然後他有另一個定義的類不是部分類。什麼時候使用存儲庫模式應該手動創建類,並完全忽略Datacontext?MVC倉庫模式:創建模型類

+0

根據到目前爲止的答案,他似乎將LINQtoSQL用作傳輸的中間對象,這與人們使用XML作爲中間步驟的方式相同,因爲他們不確定連接的哪一端是什麼。 – Soviut 2009-01-10 07:21:17

回答

3

如果你沒有使用中間類來分離你的前端和linq類,那麼你就無法控制數據上下文被垃圾收集。通常情況下,只要您完成了使用它們,您想立即刪除它們的實例的數據上下文類型。這裏是你會如何想用LINQ to SQL的情況下做到這一點:

using (MyDataContext data = new MyDataContext()) 
{ 
    SomeThing thing = data.Things(t => t.ID == 1); 
    return thing; 
} 
... the MyDataContext instance is gone 

隨着「使用」塊,你處置MYDataContext在最後的「}」的實例。但是,如果你這樣做,你會得到一個錯誤,然後嘗試使用「東西」,因爲數據上下文實例已經消失。如果你不要處理數據上下文,它會一直掛起,直到它最終被垃圾收集。

如果你介紹的中介類從你仍然可以擺脫你的數據上下文實例調用應用解耦的LINQ to SQL代碼,並返回相同的數據(只是在不同的對象):

using (MyDataContext data = new MyDataContext()) 
{ 
    SomeThing thing = data.Things(t => t.ID == 1); 
    SometThingElse otherThing = ConvertSomethingToSomethingElse(thing); 
    return otherThing; 
} 
... the MyDataContext instance is gone 

希望有所幫助。

2

他在他最近的一個視頻中說他不喜歡LINQ to SQL映射的方式。我同意,但我認爲這是完全矯枉過正。

我想說,只要你堅持存儲庫模式本身,你不會破壞任何主要的設計模式。我認爲有兩組classa是可以選擇的,儘管它們是不好的,但仍然是一個選擇。

3

Rob在他的一個節目中回答了這個問題。

他使用POCO類從所有數據訪問類中獲知。例如,當他將LINQ-to-SQL更改爲NHibernate時,他將需要在他的過濾器中更改他的「映射」,並且他不需要對商務邏輯進行任何更改。

+0

恰到好處。這是鬆散地將數據層耦合到網站的其他部分。所以當他想放棄L2S並用Subtext或其他東西替換它時,他只修改一個項目,而不是多個項目。 – 2009-01-14 00:52:02