【问题标题】:Frustrated with correct architecture of ASP.NET MVC application对正确的 ASP.NET MVC 应用程序架构感到沮丧
【发布时间】:2012-01-30 16:46:52
【问题描述】:

我尝试再创建一个新的 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 个表字典(Services 和 GeographicalAreas)和 2 个表(UserServices 和 UserGeoAreas)用于用户和表字典之间的多对多关系。标准情况

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

  1. 应该在第一页显示:

FirstName、LastName、Title、Company、Services(链接到用户)和 GeoAreas(链接到用户)

  1. 在第二页:

名字、姓氏、职务、公司、Facebook、Linkedin 和 Twitter

  1. 在第三页上只有 FirstName、LastName、ProfileImage 和 ProfileDocument

另外,在第一个页面上应该验证“必需”等属性

那么,如何实现呢?

第一种方式:

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

第二种方式:

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

第三种方式:

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

【问题讨论】:

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


    【解决方案1】:

    如有疑问,请使用Single Responsibility Principle

    在面向对象编程中,单一职责原则指出每个对象都应该有单一职责,并且该职责应该完全由类封装。它的所有服务都应与该职责密切相关。

    您的选项 1 是正确的。每个视图都应该有自己独特的控制器和自己独特的视图模型(理想情况下,通过对存储库的独特调用来检索)。

    【讨论】:

    • 但是我们必须创建 3 个相似的视图类(想象 3 个类,它们有大约 30 个字段,90% 的字段相同),如果我们改变模型,每个类都必须改变(即向 DB 添加新字段)和 3 个类似的 linq-requests。
    • 在这种情况下是否需要创建存储库类,或者直接在控制器类中向_dbcontext发出请求会更好?
    • 这是一个权衡。一方面,您有各种相似的类,另一方面,当必须修改一个视图时,您不必记住使用一个类的所有位置。它总是归结为一旦你必须改变某些东西就会变得多么复杂。经验法则是:每个视图一个模型。关于存储库:DbContext 本身的行为就像一个存储库。将自定义存储库置于顶部会带来复杂性,并且不应在没有充分理由的情况下进行。但这是我的看法,其他人可能会有所不同。
    • 关于存储库的一些话。 IE。相同的请求在不同的地方使用了 2 次。所以,最好把它移到单独的类中
    猜你喜欢
    • 2011-05-29
    • 2016-07-07
    • 2011-01-26
    • 1970-01-01
    • 2014-07-21
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多