2012-01-30 2 views
0

Я попытался создать еще одно новое приложение ASP.NET MVC (с Entity Framework) и немного расстроено снова.Разочарована с правильной архитектурой приложения 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 and GeographicalAreas) и 2 таблицы (UserServices и UserGeoAreas) для отношений «многие-ко-многим» между пользовательскими и табличными словарями. Стандартная ситуация

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

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

FirstName, LastName, название, компания, услуги (связанные с пользователем) и GeoAreas (связан с пользователем)

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

FirstName, LastName, название, компания, Facebook, Linkedin и Twitter

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

Кроме того, на filrst странице должны быть проверки атрибутов, таких как «требуется» и т. д.

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

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

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

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

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

Третий путь:

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

ответ

2

Если вы сомневаетесь, идти с Single Responsibility Principle:

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

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

+0

, но тогда мы должны создать 3 похожих класса вида (предположим, что 3 класса, которые имеют приблизительно 30 полей, и эти поля одинаковы для 90%), должны меняться в каждом классе, если мы вообще меняем модель (т.е. добавляем новое поле к БД) и 3 аналогичных запросов linq. – John

+0

также необходимо создать класс репозитория в этом случае или было бы лучше сделать запросы к _dbcontext непосредственно в классе контроллера? – John

+1

Это компромисс. С одной стороны, у вас есть разные аналогичные классы, с другой стороны, вам не нужно запоминать все места, где используется один класс, когда один вид должен быть изменен. Это всегда сводится к тому, насколько сложно это становится, когда вам нужно что-то изменить. Эмпирическое правило: одна модель для каждого вида. Что касается репозитория: сам 'DbContext' ведет себя как репозиторий. Помещение пользовательского репозитория на вершине вводит сложность и не должно быть сделано без уважительной причины. Но это мое мнение, другие могут отличаться. –

Смежные вопросы