2

我想了解一個好設計的項目的概念。圖層ASP.NET MVC項目

我正在使用ASP.NET MVC,我正在嘗試創建一個分層(可插入)項目。

目前的項目結構是什麼,我現在是這樣的:

  1. LayeredProject - 包含MVC項目控制器

  2. LayeredProject.EntityFramework - 包含用於數據庫中的所有POCO類。 (我使用Code First方法)

  3. LayeredProject.Model - 這應該包含項目中使用的所有業務對象。

說,該項目是一個電子商務網站,我想構建這樣的:

  • LayeredProject.EntityFramework項目我有類對應於數據庫表。類別,產品,用戶。該項目僅用於保存和加載數據庫中的數據,並且這些對象不應用於其他用途。該項目參考LayeredProject.Model項目。

  • LayeredProject.Model項目我存儲了所有我使用的對象,其中大多數都是LayeredProject.EntityFramework POCO的objsects和其他一些使用的服務類的副本。

  • LayeredProject我保留所有ViewModels類,控制器和不同的UI邏輯。該項目參考LayeredProject.Model項目。

首先,我不確定這是否是正確的方法。

而且,這是正確的做法,然後我有點困惑,因爲我將在EntityFramework項目和Model項目中複製我的POCO類。

請幫我理解這個

+1

我沒有看到在Model項目中創建EF對象克隆的理由。您可以將邏輯添加到EF類。如果你希望這些對象保持清潔,只需在代碼中進行映射而不是使用屬性。 –

+0

好吧,如果我可以將邏輯添加到EF類,並且我直接與它們一起工作,那麼他們應該進入Model項目,對吧?此外,我認爲POCO類應該是空的,沒有方法和接口繼承,但我認爲我錯了。然而,EF支持我的POCO對象,但是如果我想切換到不同的ADO,比如Linq到Sql,那麼我將不得不將linq映射到我的POCO類的sql類,對吧? – Catalin

回答

1

您可以使用分層結構以及使用MVC設計項目。控制器和視圖部分應保持完整。您可以根據需要將業務邏輯部分劃分爲多個層。該模型應該是您期望的圖層數量的結果。爲此,請將您的業務邏輯放在單獨的項目中(不必:它可以在Web項目本身中),將該項目中的dll引用到MVC Web解決方案。將通過數據庫查詢生成的模型傳遞給Web解決方案並在控制器渲染視圖的幫助下(我已使用此樣式完成了我的項目)

+0

一般概念很好,但我需要更具體的東西。 – Catalin

0

似乎您使用Code First方法來構建數據訪問,你可以在這篇廣泛的文章中挖掘並獲得更多的見解。

http://ofps.oreilly.com/titles/9781449320317/ch_AdvancedData.html

+0

不錯的文章,我現在正在閱讀。謝謝 – Catalin

+0

盡情享受吧,我更喜歡閱讀,但您也可以在http://www.asp.net/mvc/pluralsight上欣賞一些免費視頻 – hagensoft

+0

Pluralsight的好插頭,因爲Pluralsight很棒。 – garfbradaz

0

你可能有一個太多層在那裏,應該有,除非你計劃有一個客戶端應用程序或其他一些沒有理由從LayeredProject MVC層本身的業務邏輯模型分開單獨的項目來訪問模型。在MVC項目中,您已經有一個模型文件夾可用於此目的。但是在MVC項目中,您還應該添加一個「ViewModels」文件夾來保留專門用於視圖關注的模型(例如DTO對象)。

該項目顯示了一個很好的簡單方法,可以將事情簡單地分離到MVC項目的文件夾中:RacoonBlog Project。雖然它使用RavenDB而不是EF,但這些想法是相同的。有控制器,視圖和模型:我曾

+0

是的,我計劃將來在不同的環境中使用核心應用程序,如平板電腦或桌面應用程序。我會看看這個項目,謝謝 – Catalin

0

大多數MVC應用程序以這種方式

MVC項目進行分層。業務邏輯駐留在模型中。

數據訪問層(持久層):該項目使用ORM。 (在您的案例實體框架中)

映射到數據庫表的類位於模型中,而不是數據訪問層。

+0

爲了讓模型中的類保持使用Code First方法,並將DataContext保留在DAL中?或者你在Model和DAL項目中都有相同的類? – Catalin

+0

不確定第一種方法是什麼。我猜這意味着數據庫不存在,你開發你的模型並開發數據庫?無論哪種方式,數據庫的對象表示都保留在應用程序中。爲了分離問題,DAL不應該關心這些類。 – developer747

1

的MVC項目應包括:

  • 視圖模型:對於那些非常具體呈現每個觀點的看法,即模型模型(模型,這些都不是M在MVC)。此模型通常包含必須在視圖中顯示或編輯的數據以及呈現視圖的必要信息:例如,如果視圖必須呈現「下拉列表」,視圖模型應包含相應的SelectList或IEnumerable to填充列表。您可以使用映射器(如AutoMapper或ValueInjecter)將業務實體(來自業務層的實體)的數據移動到視圖模型,反之亦然。或者,如果合適,你可以直接使用業務實體模型視圖屬性(視圖模型並不需要是平的:它可以包含對象屬性)
  • 觀點,與視圖模型強類型
  • 控制器:此控制器使用業務邏輯(即MVC中的Model,M)來控制應用程序流,爲視圖創建和提供模型視圖,並對用戶操作作出反應。UI助手:I通常會添加此圖層以滿足DRY原則。即如果我必須準備一個SelectList並且它將被用於許多視圖,那麼我在這個層中執行它,並從所有必要的地方使用它。這可能包括計算,排序或與UI緊密相關的任何內容,因此它不適合業務層(模型)。這使用業務層,併爲視圖提供特定的數據。

這些是MVC的特定和關鍵部分,它包括MVC中的VC(視圖和控制器)MVC(模型)中的M是可以像往常一樣完成的業務邏輯。即您不必在業務層中做任何特殊的事情來將其用於MVC。您可以使用您選擇的技術(傳統的DAL + BLL,WCF,WS或任何您想要的)。

這對於LOB應用程序來說效果很好。當然,如果你正在製作一個玩具應用程序,你可以忘記這一切,讓更多的東西變得更加單一。但我僅僅提出了這個適用於維護需求稀少的應用程序。

這些都是允許編輯「寵物」,在幾層對象的示例:

  • 業務邏輯層:
    • PetService,它可以使用的讀,寫,找到一個類,並修改寵物(如上所述,這並不重要)
  • 業務實體:這是管理寵物的BLL實體。這可能是一個POCO對象或DDD實體:
    • 寵物 - INT標識,詮釋PetTypeId,字符串名稱...
  • 視圖模型:包含寵物proerty,以及PetTypes的列表,這樣視圖可以呈現下拉列表中PetTypeId:
    • PetViewModel - 寵物ThePet,的SelectList PetTypes
  • UI助手:如果PetTypes會在多於一個或兩個視圖中使用, PetUiHelper可以爲所有需要的視圖提供這個選擇列表重新它:
    • PetUiHelper - GetPetTypesList()
  • 寵物的觀點:對於PetViewModel
    • 查看\寵物\ Edit.cshtml
  • PetController一個強類型的視圖:使用PetService到創建視圖和模型視圖。
    • PetController - 編輯(int id) - >返回一個編輯視圖,它的對應的PetViewModel。還必須有一個HttpPost編輯操作,它接收特定模型或PetViewModel中的用戶輸入,或寵物加上Id或其他內容。這取決於你正在編輯的內容。

最後,如果你知道如何使用DI,可以使用Unity.Mvc或任何其他選項注入業務服務中的控制器。