我有一個三層(演示,業務邏輯和數據訪問)的應用程序。在數據訪問層中,我有一個名爲Unit
的對象,並且在業務層中有另一個名爲Unit
的對象。如何處理業務層和數據訪問層之間的雙向依賴關係?
當在業務層的Unit
對象上調用Insert()
時,它會調用Insert()
方法對數據訪問層中的相應對象進行傳遞,並將其自身作爲參數傳遞。我遇到的問題是數據訪問層沒有引用業務層,並允許它這樣做會導致循環依賴。
我的方法有缺陷嗎?如果是這樣,那麼對我的問題有什麼好的解決辦法?
我有一個三層(演示,業務邏輯和數據訪問)的應用程序。在數據訪問層中,我有一個名爲Unit
的對象,並且在業務層中有另一個名爲Unit
的對象。如何處理業務層和數據訪問層之間的雙向依賴關係?
當在業務層的Unit
對象上調用Insert()
時,它會調用Insert()
方法對數據訪問層中的相應對象進行傳遞,並將其自身作爲參數傳遞。我遇到的問題是數據訪問層沒有引用業務層,並允許它這樣做會導致循環依賴。
我的方法有缺陷嗎?如果是這樣,那麼對我的問題有什麼好的解決辦法?
你說得對,你這樣做的方式需要層之間的雙向依賴關係,而這幾乎總是一件壞事。這種依賴性的原因是您的業務邏輯層承擔了持久層的某些責任(通過在業務邏輯層中實現Insert()
)。
看起來你在這裏混合了兩個不兼容的概念。
首先,您聲明您的代碼中有三層:演示文稿,業務和數據訪問。這個陳述的問題在於,您還聲稱使用active record類似模式(unit.Insert()
)。如果你真的有一個獨特的域(業務)層和持久性(數據訪問)層,那麼域對象將不知道如何Insert()
。
看看repository pattern。這種模式更適合建立獨特的持久層。如果使用此模式,則可以在持久層中定義一個「實體」,並將域層中的Unit
對象映射到持久層中的Unit
對象。 AutoMapper應該可以幫助您避免手動將域模型映射到實體的麻煩。
@odiseh,我想你沒有得到答案,因爲很難破譯你的問題。我盡我所能重申了這一點。如果我錯誤地解釋了你的問題,請將其改回(我不會生氣)。 – 2010-03-10 16:13:42
@Michael:謝謝。這正是我所要求的。非常感謝 – odiseh 2010-03-11 05:32:58