Я попытался создать еще одно новое приложение 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 разных страниц:
- На первой странице должны быть отображены:
FirstName, LastName, название, компания, услуги (связанные с пользователем) и GeoAreas (связан с пользователем)
- на второй странице:
FirstName, LastName, название, компания, Facebook, Linkedin и Twitter
- На третьей странице только FirstName, LastName, ProfileImage и ProfileDocument
Кроме того, на filrst странице должны быть проверки атрибутов, таких как «требуется» и т. д.
так, как его реализовать?
Первый способ:
Создание 3 различных представления-классов (3 разных моделей) для каждой страницы, создавая 3-й различный Linq-запросы (3 открытых методов в классе-хранилище), каждый метод контроллера (для каждая страница) вызывает соответствующий метод в классе-хранилище
Второй способ:
Создать один общий класс представления (который включает в себя все требуются поля для 3-х страниц), один общий метод в класс-хранилище, заполняющую все поля, каждый метод контроллера вызывает метод репозитория
Третий путь:
Создание 3 различных представления-классов (3 разных моделей) для каждой страницы, один общий класс (который включает в себя все требуются поля для 3-х страниц), один метод в классе-хранилище, заполняющее все поля, 3 конвертера для перемещения данных из общего класса в соответствующий класс вида.
, но тогда мы должны создать 3 похожих класса вида (предположим, что 3 класса, которые имеют приблизительно 30 полей, и эти поля одинаковы для 90%), должны меняться в каждом классе, если мы вообще меняем модель (т.е. добавляем новое поле к БД) и 3 аналогичных запросов linq. – John
также необходимо создать класс репозитория в этом случае или было бы лучше сделать запросы к _dbcontext непосредственно в классе контроллера? – John
Это компромисс. С одной стороны, у вас есть разные аналогичные классы, с другой стороны, вам не нужно запоминать все места, где используется один класс, когда один вид должен быть изменен. Это всегда сводится к тому, насколько сложно это становится, когда вам нужно что-то изменить. Эмпирическое правило: одна модель для каждого вида. Что касается репозитория: сам 'DbContext' ведет себя как репозиторий. Помещение пользовательского репозитория на вершине вводит сложность и не должно быть сделано без уважительной причины. Но это мое мнение, другие могут отличаться. –