Разочарован правильной архитектурой приложения ASP.NET MVC - PullRequest
0 голосов
/ 30 января 2012

Я попытался создать еще одно новое приложение 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 и GeographicAreas) и 2 таблицы (UserServices и UserGeoAreas) для взаимосвязи много-к-много между пользователем и таблицами-словарями.Стандартная ситуация

Также у нас есть 3 разные страницы:

  1. На первой странице должны отображаться:

FirstName, LastName, Title, Company, Services(связан с пользователем) и GeoAreas (связан с пользователем)

  1. На второй странице:

Имя, Фамилия, Название, Компания, Facebook, Linkedin и Twitter

  1. На третьей странице только FirstName, LastName, ProfileImage и ProfileDocument

Также на странице filrst должны быть проверены такие атрибуты, как «required» и т. Д.

так, как это реализовать?

Первый способ:

Создание 3 разных классов просмотра (3 разных модели) для каждой страницы, создание 3 разных linq-запросов (3 открытых метода в хранилище классов), каждый методконтроллера (для каждой страницы) вызывает соответствующий метод в репозитории классов

Второй способ:

Создайте один общий класс представления (который включает в себя все обязательные поля для 3 страниц), один общий методв репозитории классов, который заполняет все поля, каждый метод контроллера вызывает метод репозитория

Третий способ:

Создание 3 разных классов представления (3 разных модели) для каждой страницыодин общий класс (который включает в себя все необходимые поля для 3 страниц), один метод в хранилище классов, который заполняет все поля, 3 преобразователя для перемещения данных из общего класса в соответствующий класс представления.

1 Ответ

2 голосов
/ 30 января 2012

В случае сомнений придерживайтесь принципа единой ответственности :

В объектно-ориентированном программировании принцип единой ответственности гласит, что каждый объект должен нести одну ответственность, и эта ответственность должна быть полностью инкапсулирована классом. Все его услуги должны быть тесно связаны с этой ответственностью.

Ваш вариант 1 будет правильным. Каждое представление должно иметь свой собственный отдельный контроллер и свою собственную отдельную модель представления (в идеале извлекается с помощью своего отдельного вызова в хранилище).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...