2011-05-13 127 views
15

從傳統的將業務層,服務層,數據訪問層和表示層構建到Web應用程序的方式轉變爲MVC設計模式,我覺得很困難瞭解它如何適應舊模式。ASP .NET MVC體系結構適合傳統的多層體系結構

似乎MVC模型本身已經完成了需要分離的問題,而這些問題是通過分層體系結構來實現的。請問有人可以在這個問題上談一談?

作爲參考,下面是我的理解它,請在此

MVC的視圖和控制器與視圖模型-are- 表示層

MVC模型一起分享你的觀點 - 能是 - 數據訪問層或業務層甚至業務層

+1

可能重複[如何MVC(ASP.NET MVC)帶3層架構可以一起工作?](http://stackoverflow.com/questions/3047230/how-mvc- asp-net-mvc-band-3-tier-architecture-can-work-together) – jgauffin 2011-05-13 11:17:50

+2

這不是重複的,因爲另一篇文章討論的三層體系結構更多地來自物理的分離視角而不是概念上的分離。 – Max 2011-05-13 15:12:17

回答

36

我看到Asp.Net MVC部分僅作爲整個應用程序的視圖(或演示文稿)部分

我也在努力解決如何以適當的方式構建應用程序的問題。
洋蔥架構我聽說here(尤其是圖像中發現here),我的解決方案看起來是這樣的:

  • Project.Core
    業務邏輯/服務的實現,實體,必須由其他項目實施的接口(即「IRepository」,「IAuthenticationService」,...)
  • Project.Data
    數據庫連接 - 在我的情況下NHibernate存儲庫和實體映射到這裏。 實現Project.Core
  • 數據γ-接口
  • Project.UI.Web
    的Asp.Net MVC( 「演示」)項目 - 它電線整個應用程序一起。
    在Project.Core中實現了接口,並將它們(以及來自Project.Data的接口)與Castle Windsor等一些DI框架連接起來。

Project.UI.Web遵循以下約定:(!)

  • 車型的ViewModels
  • 意見消耗他們自己的視圖模型(單view-one-viewmodel)
  • the controllers just nee d到驗證輸入,轉換域對象(如業務邏輯exacly一無所知的ViewModels)和代表實際工作(業務邏輯)的業務服務。

摘要:
如果按照這個模型是有幫助的重點項目。Corereal應用。它不擔心數據的真實持久性,也不關心它如何呈現。這只是關於「如何做」。但它規定了其他項目必須提供實現的規則和契約(接口)。

我希望這可以幫助你如何佈局一個Asp.Net MVC應用程序!

了Lg
warappa

+1

我不明白核心服務實現是如何實現的。它不應該超出Project.Core的範圍嗎?這樣,你可以防止意外緊密耦合到svc而不是svc接口。 – Narayana 2013-12-10 07:50:11

-2

非常基本的解釋:

如果您創建一個新的MVC應用程序,您將自動獲得一個控制器,模型和視圖文件夾。

您的控制器的行爲與您的業務層類似
模型是數據訪問/服務層
和視圖是表示層。

有關詳細解釋,請參見http://www.asp.net/mvc

+14

控制器不是業務層。事實上,控制器應儘可能薄 – psousa 2011-05-13 11:12:40

+2

我與@psousa在這一個,事實上,微軟建議在控制器中根本沒有任何業務邏輯,並處理所有模型。 – Max 2011-05-13 15:16:46

0

總之:沒有太大的變化。我只熟悉一些演示模式:MVP(模型,視圖,演示者,常用於windows窗體/ asp.net),MVC(模型,視圖,控制器)和MVVM(模型,視圖,視圖模型,通常在WPF/Silverlight中使用)。

鏈接:http://haacked.com/archive/2008/06/16/everything-you-wanted-to-know-about-mvc-and-mvp-but.aspx

上面的鏈接應該回答一些(如果不是全部)你的問題。

我通常編寫ASP.NET MVC應用程序的方式是至少包含CRUD操作的服務/業務層混合(因爲數據訪問既不屬於視圖模型也不屬於控制器,絕對不屬於視圖!)。

+0

如果你使用enitiy框架怎麼辦?它確實以一套簡單管理的MVC數據模型的形式爲您提供抽象。你需要一個附加的數據訪問層嗎? – Max 2011-05-13 15:22:46

+0

像Automapper這樣的東西可以用來將EF的實體映射到您的域模型。我建議將域模型保留在MVC模型名稱空間之外,並將它們放入它們自己的程序集中。 – 2011-05-13 17:12:05

3

正如其他人所說,它並沒有太大的變化。我的應用程序通常是架構這樣:

  • 模型層(域和視圖模型)
  • 庫層(數據訪問)取決於 應用程序/要求
  • 服務層(有時實施 爲WCF服務)
  • 服務器側MVC 層(Asp.net MVC本身)
  • 客戶端側MVVM或MVC(經由 任Knockout.js,Backbone.js的,或 脊柱。js)

在服務器端MVC層,我的控制器方法很輕。他們通常在服務層對象上調用一個方法來獲取一些數據,並將其作爲Json數據傳遞給客戶端。

因爲我送Json回來,所以我的看法也非常輕而稀疏。通常只包含腳本包含和將用客戶端模板庫呈現的模板。