对ASP.NET MVC应用程序的正确架构感到沮丧

时间:2012-01-30 16:46:52

标签: asp.net-mvc-3 entity-framework

我尝试再创建一个新的ASP.NET MVC应用程序(使用Entity Framework),再次有点沮丧。

例如,我有一个包含以下表格的数据库:

表用户:

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个表 - 字典(服务和GeographicalAreas)和2个表(UserServices和UserGeoAreas),用于用户和表字典之间的多对多关系。标准情况

我们还有3个不同的页面:

  1. 应显示第一页:
  2. FirstName,LastName,Title,Company,Services(链接到用户)和GeoAreas(链接到用户)

    1. 在第二页:
    2. FirstName,LastName,Title,Company,Facebook,Linkedin和Twitter

      1. 在第三页上只有FirstName,LastName,ProfileImage和ProfileDocument
      2. 此外,在第一页上应该验证“必需”等属性

        那么,怎么实现呢?

        第一种方式:

        为每个页面创建3个不同的视图类(3个不同的模型),创建3个不同的linq请求(类库中的3个公共方法),每个控制器的方法(对于每个页面)在类中调用适当的方法-repository

        第二种方式:

        创建一个公共视图类(包括3个页面的所有需求字段),类库中的一个常用方法,它填充所有字段,每个控制器方法调用存储库的方法

        第三种方式:

        为每个页面创建3个不同的视图类(3个不同的模型),一个公共类(包括3个页面的所有需求字段),类库中的一个方法,它填充所有字段,3个转换器来移动数据从公共类到适当的视图类。

1 个答案:

答案 0 :(得分:2)

如有疑问,请使用Single Responsibility Principle

  

在面向对象的编程中,单一责任原则规定每个对象应该只有一个责任,并且该责任应该由类完全封装。它的所有服务都应该与这一责任保持一致。

您的选项1将是正确的选项。每个视图都应该有自己独特的控制器和自己独特的视图模型(最好通过它自己对存储库的不同调用来检索)。