2011-11-03 72 views
1

不知道是否有一個「官方」的名字,但DataContext的我的意思是一個對象,透明地維護對象的狀態,提供更改跟蹤,語句的工作功能,併發性和可能很多其他有用的功能。 (在Entity Framework中,它是ObjectContext,在NHibernate - ISession中)。DAL:DataContext的原理的理解

最後我想出了一個想法,那就是應該在我的應用程序中實現這個功能(它使用mongodb作爲後端,當我們能夠跟蹤某個屬性更改時,mongodb的部分更新很好)。

因此,實際上,我已經得到了關於這個問題的幾個問題

  1. 任何人都可以制訂要求的DataContext? - 你對它的任務和責任有什麼瞭解? (我設法找到的最相關的是Esposito的書,但不幸的是這與msdn樣本級別有關)。

  2. 對於變更跟蹤實施,你會有什麼建議? (以最簡單的方式,可以在實體中「手動」地跟蹤更改,但需要編碼並將dal與業務邏輯混合,所以我最感興趣的是「自動」方式,讓實體更加便宜)。

  3. 有沒有辦法利用一些現有的解決方案? (我希望nhibernate基礎結構允許插入自定義模塊與幕後的mongo一起工作,但不知道它是否允許使用非sql dbs)。

+0

獲取Fowler的「企業應用程序體系結構」的副本。它詳細介紹了存儲庫,工作單元和其他相關模式。 –

+0

對,我知道模式細節,主要是如何將所有這些抽象概念統一在「數據上下文」的範圍內。 – mikalai

回答

0

DataContext(EF中的ObjectContext或DbContext)只是Unit of Work (UoW)/Repository模式的實現。

我建議你福勒對Patterns of Enterprise Application Architecture本書中,他概述了一些持續性模式的實現。這可能有助於實施您自己的解決方案。

  1. DataContext基本上需要完成一個UoW的工作。它需要處理讀取和管理給定生命週期(即HTTP請求)s.t.中涉及的對象。內存中沒有兩個對象表示DB上的相同記錄。此外,它需要提供一些更改跟蹤以執行對數據庫的部分更新(如您已經提到的)。

  2. 在什麼方面改變跟蹤,我完全同意,污染與改變事件性質等是壞的。 EF4.1中引入的最近模板之一使用Proxies來處理該模板,並提供可能的簡單POCO。

+0

_introduced EF4.1 uses Proxies to handle that_ 也許你知道,是否有可能在EF環境中使用這些代理? – mikalai

+0

不幸的是我不知道。這些代理在後臺完全動態創建。嘗試搜索谷歌的「實體框架4.1 POCO代理」或類似的東西。 – Juri

+0

順便說一句,也從你所說的關於記憶中的物體,我想應該有一個身份地圖。還有一點我關心的是,我已經實現了幾個存儲庫(每個實體)。你的建議是什麼 - 使DataContext成爲他們的門面或將存儲庫概括爲一個類? – mikalai

0

答到quetion 2:爲了讓POCO類的工作,你將需要生成在運行時代碼,可能使用的System.Reflection。

如果你分析EntityFramework,你會發現它需要虛擬屬性來進行變更跟蹤...這是因爲它需要在運行時創建一個生成的類,覆蓋每個屬性,然後將代碼添加到當有人改變該屬性時告訴DataContext。

的EntityFramework還生成代碼來初始化集合,因此,當有人試圖做的操作,如添加和刪除,集合對象本身知道該怎麼做。

+0

好吧,我可以生成一個覆蓋虛擬屬性並跟蹤更改的派生類型。不確定收藏。如果將屬性/字段聲明爲ICollection,可能會有可能 - 只是將ICollection實現替換爲字段。但是如果它被聲明爲List?你怎麼看? – mikalai

+0

如果它是一個List,那麼在使用DataContext保存更改時,必須找出哪些元素已被添加或刪除,因爲您必須將原始元素列表與已更改並確定哪個列表進行比較要更新,插入或刪除元素的元素。 –

+0

好吧,那很簡單,爲什麼我之前沒有想過呢?謝謝) – mikalai