ASP.Net MVC是UI層的框架,EF是數據訪問的邏輯。
如果在Controller中using DbContext,把查詢的結果的對象放到cshtml中顯示,那么一旦在cshtml中訪問關聯屬性,那么就會報錯。因為關聯屬性可以一致關聯下去,很誘惑人,include也來不及。
如果不using也沒問題,因為會自動回收,但是這打開了“潘多拉魔盒”,甚至可以在UI層更新數據,相當於把數據邏輯寫到了UI層。
有的三層架構中用實體類做Model,這樣也是不好的,因為實體類屬於DAL層的邏輯。
沒有最好的架構,只有最合適的架構! 架構不是設計出來的,而是演化出來的!
一、EO
EO(Entity Object,實體對象) 就是EF中的實體類,對EO的操作會對數據庫產生影響。
DTO(Data Transfer Object,數據傳輸對象),用於在各個層之間傳遞數據的普通類,DTO有哪些屬性取決於其他層要什么數據。DTO一般是扁平類,也就是沒有什么關聯屬性,都是普通類型的屬性,一些復雜項目中,數據訪問層和業務邏輯層直接傳遞用一個DTO類,DTO類類似與三層架構中的Model。
EO 相當於DataTable,不能傳輸到DAL之外; DTO就是三層Model,在各個層中間傳輸數據用的
VIewModel(視圖模型),用來組合來自其他層的數據顯示到UI層,簡單的數據可能可以直接把DTO交給界面顯示,一些復雜的數據可以要重新轉換為VIewModel對象。
二、多層架構
搭建一個ASP.NET MVC三層架構項目:DAL、BLL、DTO、UI(asp.net.mvc)。UI、DAL、BLL 都引用DTO;BLL引用DAL;EF中所有的代碼都定義到DAL, BLL中只訪問DAL、BLL中不要引用DAL中EF的類,不要在BLL中執行Include操作,所有數據准備工作都在DAL中完成
三、架構退化
UI+BLL+DAL => UI+Service
合適的架構:能夠滿足當前項目的要求,並且適度的考慮以后的項目的發展,不要想的太遠,不要“過度架構”,讓新手能夠快速入手
UI項目雖然不直接訪問EF中的類,但是仍然需要在UI項目的App.config(Web.config)中對EF做配置,也要在項目中通過Nuget安裝EF,並且把連接字符串配置在UI的web.config中
