1

從業務對象中分離數據訪問代碼並不新鮮,但我一直在尋找實現某些功能的「最佳方式」。從業務對象中抽象出數據訪問層

我有以下類:

橙色 - 這是我的業務對象。

OrangeList - 這是一個桔子列表。

用戶將通過調用OrangeList.Fetch(someCriteria)從數據存儲中獲取Orange對象。因此,OrangeList必須具有對數據訪問層的引用 - 因此它具有以下屬性:IDataProvider MyDataProvider。

這對我很有用,但問題是我們無法單獨獲取一個橙色 - 我們總是需要通過OrangeList。

Orange或OrangeList中的一個或者兩個都必須從某個可容納DataProvider的公共對象中下降。

這是一個問題,還是我的方法在第一個地方脫穎而出?

任何提示/指針表示讚賞,謝謝。

編輯:根據下面的討論,我檢出了Repository模式。

但是,對於我的項目,我認爲將Repository與DAL進一步分離是一個好主意。

因此....存儲庫是我如何獲得橙子,並保存橙子,但仍然不知道如何。我將它委託給IDataProvider,它可以是圖中列出的許多數據。

澄清 - Orange不知道如何獲取/更新自己,對不對?這是一個純粹的業務對象 - 這是重點嗎?

alt text http://img22.imageshack.us/img22/2460/repositorya.jpg

如果你想知道,我的「LegacyDataProvider」是支持舊系統,它訪問基於文件的數據庫(FoxPro中,伊克) - 但這讓我把這個包起來,並保持它從我的新代碼開始。

在.NET程序集建設方面,以防止循環引用,它看起來像我要去有Repository.DLL [OrangeRepo],一個DataProviderInterface.DLL [IDataProvider]和BusinessObjects.dll [橙]。都好?

我有知道存儲庫的想法嗎?

回答

2
+0

感謝你,雖然它看起來像我 - 我的OrangeList是存儲庫? – Duncan 2009-04-10 22:44:39

+0

你的OrangeList是OrangeRepository的方法,如 rep.GetOrange(Guid id); .GetOranges()等 或者看看Rob Conery的管道和過濾器方法http://www.asp.net/learn/mvc-videos/#MVCStorefrontStarterKit – Sebastian 2009-04-11 08:06:14

+0

好的,上面的編輯對我的問題有意義嗎? – Duncan 2009-04-11 11:23:59

1

我(並)構成所有這些事情關閉主API對象(OrangeCart?),其也構成用於數據訪問層的界面的對象。您的Orange和OrangeLists知道他們屬於OrangeCart並與其通話以進行DAL操作。

+0

好的,所以你說甚至連OrangeList都沒有DAL知識?相反,Orange AND OrangeList有一個Fetch方法,但是當它被調用時,它會調用OrangeCart.Fetch()? – Duncan 2009-04-10 22:58:59

+0

爲什麼不在OrangeCart中只有FetchOrange和FetchOrangeList的方法? 我覺得它更像一個工廠模式,只有工廠必須知道橙子(香腸)是如何構造的,以及其他人都知道要去工廠獲取橙子的雜亂細節。 – 2009-04-10 23:35:05

0

而不是OrangeList(someCriteria),我會有Oranges.Criteria1List,Oranges.Criteria2List。對於一個單身人士,我會有Oranges.GetItem(orangeId)。

按照自己的方式,BusinessObject最終需要考慮邏輯數據設計術語而不是概念術語。 (存儲庫實現給我帶來了同樣的不舒服感 - 它們常常被用於在表上放置一個簡化抽象粗代碼層)我不喜歡BL需要了解數據庫實現細節,如數據類型和大小。通常解耦這些類型的依賴關係是非常有用的。)

+0

le dorfier儲存庫的整個要點是將BL從這些細節中屏蔽掉。這個想法是讓存儲庫隱藏特定數據結構與應用程序其餘部分的映射。這也並不意味着它必須適用於數據庫。當然,有很多沒有這樣做:(。 – eglasius 2009-04-10 23:58:02