2009-02-18 73 views
6

對於一個大型項目來說,是否有一個數據環境可以映射出您的數據庫,您可以從您的類中進行交互?我應該使用一個LINQ DataContext還是很多?

或者更有意義的是將它分解爲小數據環境,這些環境專注於數據庫中將需要的特定任務。

我很好奇的表現。我的理解是,datacontext本身是一個非常輕量級的對象,它只會在需要時初始化其內部集合等。因此,處理具有多種定義的數據上下文,但只有兩個數據表應該像處理特殊的數據上下文一樣快只有這兩張表。

我也認爲你會在JIT時間受益,因爲做數據訪問的第一個類將編譯你現在可用於所有類的dc。

+0

http://stackoverflow.com/questions/226127/multiple-single-instance-of-linq-to -sql-datacontext – spender 2009-02-18 02:27:28

回答

9

我假設你問的是設計還是運行時模式。我一般會說

儘管可能將數據庫分割成多個數據上下文,但如果並且僅當兩個上下文之間沒有重疊時,這纔是可取的。

重疊是爲

例如你有一個WebsiteContext和一個AdminContextWebsiteContext用於顯示Product並履行Order s。 A WebsiteUser附加到OrderAdminContext用於您的Staff會員處理退款Orders,其中也參考WebsiteUserAdminContext還需要重置密碼並更新WebsiteUser的其他詳細信息。

你想這樣做的,因爲你不想要的網站來處理,甚至不知道有關Returns

WebsiteContext 
Product -- Order -- WebsiteUser 

AdminContext 
Staff -- Returns -- Order -- WebsiteUser 

在上面,我們可以看到我們在不同的數據複製許多對象上下文。這聽起來很糟糕,它確實表明人爲地將數據庫分成不同的數據上下文是一個錯誤的決定。你有沒有> 2個數據庫,或只有一個?這種重複違反了DRY原則(不要重複自己),因爲WebsiteContext.WebsiteUser與AdminContext.WebsiteUser不同,很可能代碼在需要關心他們引用哪個的時候會變得混亂。


LINQ的數據上下文只是一個OR映射器,並且需要被當作一個奇特的黑盒子,使得寫一些數據訪問代碼更容易。一些linq演示使它看起來像不再需要其他層,但任何複雜程序仍然受益於分層設計。

將Linq對象視爲僅用於輕鬆傳輸數據的對象,並創建一個將其隱藏爲實現細節的Domain層即可。閱讀DDD - 領域驅動設計。

就其本身而言,僅使用UI中的Linq對象最類似於Transaction Script模式。在這種情況下,您仍然可以從具有處理細節的邏輯層中受益。


雖然您可能不希望上下文的責任如此寬泛,但數據上下文只是數據庫的表示。這不是一種安全機制,它不能阻止你破壞數據。

1

從「存儲庫模式」的角度來看,有些東西需要說明具有單獨的聚合和最小化聚合之間的導航屬性。我不是100%確定那是什麼東西雖然...目前我是考慮使用中等大小的dbml,使用它的多個存儲庫(UI不直接使用datacontexts存儲庫類),導航屬性標記爲內部,以便DAL可以使用它們...也許...