2012-01-05 173 views
8

我從頭開始創建一個解決方案,使用ASP.NET Web窗體C#。.NET N層體系結構:我該如何處理Model對象?

我很關心模型對象,因爲我不想在每個圖層中創建模型對象的重複集合。在Web Forms的3層架構中使用Model對象的最佳做法是什麼?

我心目中的結構如下:

  • UI
  • BLL
  • DAL
  • 型號

模型將包含所有的模型那可以用於圖層的每個部分。我認爲這會很有用,因爲每個圖層都需要訪問模型對象。例如:

  1. 用戶界面調用BLL中的方法傳入填充數據的模型對象。
  2. BLL調用DAL的方法通過其在數據庫中保存的 對象等

感謝

+1

時髦的看看我的答案在這裏:http://stackoverflow.com/a/7474357/559144這是我做事情和運作良好的常用方式,不僅對於MVC和實體框架...實際上在MVC模型庫d是一個實體類型,它只包含由較低層定義的真實商業實體所包含的一些字段,它取決於您是否真的需要在UI級別中的所有字段,或者只有某些字段可以執行一些數據渲染和輸入。 – 2012-01-05 11:24:24

+5

僅供參考,「層」和「層」不是等效的術語。如您所描述的,層指的是邏輯分離。層通常指物理硬件分離(即數據庫服務器,Web服務器)。 – MattDavey 2012-01-05 11:53:53

+0

@MattDavey:啊,我明白了,謝謝! – Funky 2012-01-05 11:57:03

回答

1

看看我的答案在這裏:https://stackoverflow.com/a/7474357/559144這是通常的方式,我做的事情,並在MVC效果很好,不僅爲MVC和Entity Framework ......其實模型可能是一個實體類型,它只包含由較低層定義的真實商業實體所包含的一些字段,這取決於您是否真的絕對需要UI級別中的所有字段,或者只有一些可以執行一些數據渲染和輸入...

+1

很好的回答!非常簡單和明確的切割!我已經在我的解決方案中實現了這一點,並且它很好地工作,因此所有事情都被分開了,因此可以很容易地在將來添加,而不必複製模型對象 – Funky 2012-01-12 10:13:11

+0

@ Davide,在MVVM的情況下,如何處理INotified .. .in模型 – 2012-05-05 06:34:52

8

模型可以是cross-cutting concern你的層,這是一個快速的方法來做到這一點。或者你可以爲你的模型創建接口,這樣你就可以簡單地填充BLL之類的接口 - 這至少可以阻止交叉。

它進一步取決於您的模型是簡單的數據容器(anemic domain model),還是包含行爲,如驗證自己或跟蹤更改本身的能力(rich domain model)。

你可以發現你的DAL實際上由兩部分組成:樣板文件 - 永不特定於與數據庫交談的應用程序代碼,以及特定於應用程序的填充模型代碼。我們有這種情況。我們共享模型的接口,特定於應用程序的DAL代碼可以使用此接口來推送和從模型中提取數據,但「真正的」DAL代碼適用於原始數據。

5

在一個相對較小的應用程序中,您可以共享您的Domain Entities一直到您的Presentation layer,但請注意引入的耦合。

如果您的數據綁定,你除了Customer類型的實體與屬性AddressStreetLine1StreetLine2屬性,則所有的層緊密結合在一起,在一個層的變化可能會引起其他層的變化。

所以你的決定應該基於你的項目的規模和耦合量。

如果您選擇低耦合設計,那麼您的BLL將使用您的DAL來檢索實體並使用這些實體執行行爲。然後BLL將使用Data Transfer Objects傳遞給您的Presentation layer,因此您的presentation layer與您的Domain Model之間沒有耦合。

+0

對於額外的解耦,您可以在BLL和UI之間添加服務/應用程序層(http://martinfowler.com/eaaCatalog/serviceLayer.html)。 – MattDavey 2012-01-05 12:10:15

+1

服務層可能是有益的,例如,如果您使用的是WCF或其他類型的服務,但您需要注意應該在您的域模型中的邏輯不會泄漏到您的服務層中,並最終得到貧血域模型:http://martinfowler.com/bliki/AnemicDomainModel.html(我不得不承認,這發生在我身上幾次) – 2012-01-05 12:34:17

+0

+1同意 - 服務層除了**座標之外不應該做任何事情**序列的領域模型中的邏輯。 – MattDavey 2012-01-05 16:06:12

0

作爲一個相關主題,請參閱我最近發佈的related answer,以避免在跨平臺客戶機/服務器系統中重複代碼和更正體系結構。

我在此主題中爲其他海報+1了,因爲這不是一個完整的答案,只是與問題有關的有用信息。

最好的問候,