2012-01-30 48 views
0

我試圖創建一個新的ASP.NET MVC應用程序(與實體框架),再次有點沮喪。沮喪與ASP.NET MVC應用程序的正確體系結構

例如,我有以下各表數據庫:

表用戶:

CREATE TABLE [dbo].[Users](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[FirstName] [nvarchar](50) NOT NULL, 
[LastName] [nvarchar](50) NOT NULL, 
[Title] [nvarchar](max) NOT NULL, 
[Company] [nvarchar](50) NOT NULL, 
[Phone] [nvarchar](50) NULL, 

[CompanyUrl] [nvarchar](max) NULL, 
[EmailPlainText] [bit] NULL, 
[ProfileImage] [nvarchar](max) NULL, 
[ProfileDescription] [nvarchar](max) NULL, 
[ProfileDocument] [nvarchar](max) NULL, 
[ProfileWebSite] [nvarchar](max) NULL, 
[Facebook] [nvarchar](max) NULL, 
[Linkedin] [nvarchar](max) NULL, 
[MySpace] [nvarchar](max) NULL, 
[Twitter] [nvarchar](max) NULL, 
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 



CREATE TABLE [dbo].[Services](
[ServiceID] [int] IDENTITY(1,1) NOT NULL, 
[ServiceName] [nvarchar](250) NOT NULL, 
[ServiceOrder] [int] NOT NULL, 
CONSTRAINT [PK_Services] PRIMARY KEY CLUSTERED 



CREATE TABLE [dbo].[UserServices](
[UserID] [int] NOT NULL, 
[ServiceID] [int] NOT NULL, 
CONSTRAINT [PK_UserServices] PRIMARY KEY CLUSTERED 



CREATE TABLE [dbo].[GeographicalAreas](
[GeoAreaID] [int] IDENTITY(1,1) NOT NULL, 
[GeoAreaName] [nvarchar](250) NOT NULL, 
CONSTRAINT [PK_GeographicalAreas] PRIMARY KEY CLUSTERED 



CREATE TABLE [dbo].[UserGeoAreas](
[UserID] [int] NOT NULL, 
[GeoAreaID] [int] NOT NULL, 
CONSTRAINT [PK_UserGeoAreas] PRIMARY KEY CLUSTERED 

所以,我們怎麼能看到,有:一個表的用戶信息,2表字典(Services和GeographicalAreas)和2個表格(UserServices和UserGeoAreas),用於在用戶和表格詞典之間建立多對多的關係。標準情況

此外,我們有3個不同的網頁:

  1. 在第一頁上應顯示:

名字,姓氏,職務,公司,服務(鏈接到用戶)和GeoAreas (鏈接到用戶)

  1. 在第二頁上:

名字,姓氏,職務,公司,Facebook,LinkedIn和Twitter的

  1. 在第三頁上只有名字,姓氏,ProfileImage和ProfileDocument

此外,filrst頁面上應該是驗證類似屬性「required」等

那麼,怎麼實現呢?

第一種方式:

創建3個不同的視圖類(3個不同的模型)爲每個網頁,創建3個不同的LINQ-請求(在一個類儲存庫3點公開的方法),控制器的各個方法(每一頁)調用類的存儲庫的適當的方法

第二種方式:

創建一個公共視圖類(包括所有需要3頁的字段),在一個類的倉庫一個常見的方法,其填充所有字段,控制器的每種方法調用知識庫的方法

第三種方式:

創建3個不同的視圖類(3個不同的型號)的每一頁,一個共同的類(包括所有需要3頁的字段),在一個類的存儲庫的一種方法,其填充所有字段,3個轉換器將數據從公共類移動到相應的視圖類。

回答

2

如果有疑問,請與Single Responsibility Principle

在面向對象的編程,單一職責原則指出,每個對象都應該有一個責任,這個責任應完全由類封裝。它的所有服務都應該與責任完全一致。

你的選項1是正確的。每個視圖都應該有自己獨特的控制器和自己獨特的視圖模型(理想情況下可以通過自己對倉庫的不同調用來獲取)。

+0

但然後我們需要創建3類似的視圖類(想象3類,它們具有大約30個字段和這些字段的相同的90%),已在每個類改變,如果我們改變在所有(即添加新的場模型到DB)和3個類似的LINQ請求。 – John 2012-01-30 17:34:41

+0

在這種情況下,還需要創建存儲庫類,否則直接在控制器類中向_dbcontext發出請求會更好? – John 2012-01-30 17:35:49

+1

這是一個權衡。一方面,你有各種類似的類,另一方面,當一個視圖必須被修改時,你不必記住所有使用一個類的地方。它總是歸結爲它變得有多複雜,一旦你必須改變一些東西。經驗法則是:每個視圖一個模型。關於存儲庫:'DbContext'本身的行爲就像一個存儲庫。將自定義存儲庫置於頂端會帶來複雜性,不應該在沒有充分理由的情況下完成。但這是我的看法,其他人可能會有所不同。 – 2012-01-30 17:41:40