我試圖創建一個新的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個不同的網頁:
- 在第一頁上應顯示:
名字,姓氏,職務,公司,服務(鏈接到用戶)和GeoAreas (鏈接到用戶)
- 在第二頁上:
名字,姓氏,職務,公司,Facebook,LinkedIn和Twitter的
- 在第三頁上只有名字,姓氏,ProfileImage和ProfileDocument
此外,filrst頁面上應該是驗證類似屬性「required」等
那麼,怎麼實現呢?
第一種方式:
創建3個不同的視圖類(3個不同的模型)爲每個網頁,創建3個不同的LINQ-請求(在一個類儲存庫3點公開的方法),控制器的各個方法(每一頁)調用類的存儲庫的適當的方法
第二種方式:
創建一個公共視圖類(包括所有需要3頁的字段),在一個類的倉庫一個常見的方法,其填充所有字段,控制器的每種方法調用知識庫的方法
第三種方式:
創建3個不同的視圖類(3個不同的型號)的每一頁,一個共同的類(包括所有需要3頁的字段),在一個類的存儲庫的一種方法,其填充所有字段,3個轉換器將數據從公共類移動到相應的視圖類。
但然後我們需要創建3類似的視圖類(想象3類,它們具有大約30個字段和這些字段的相同的90%),已在每個類改變,如果我們改變在所有(即添加新的場模型到DB)和3個類似的LINQ請求。 – John 2012-01-30 17:34:41
在這種情況下,還需要創建存儲庫類,否則直接在控制器類中向_dbcontext發出請求會更好? – John 2012-01-30 17:35:49
這是一個權衡。一方面,你有各種類似的類,另一方面,當一個視圖必須被修改時,你不必記住所有使用一個類的地方。它總是歸結爲它變得有多複雜,一旦你必須改變一些東西。經驗法則是:每個視圖一個模型。關於存儲庫:'DbContext'本身的行爲就像一個存儲庫。將自定義存儲庫置於頂端會帶來複雜性,不應該在沒有充分理由的情況下完成。但這是我的看法,其他人可能會有所不同。 – 2012-01-30 17:41:40