Данный проект нацелен на ведение учета книг (СУБД). За его реализацию мною было принято взяться после завершения прошлого проекта и получением более глубоких знаний в ООП и C#.
ВНИМАНИЕ! Данная документация не является точным описанием всего функционала, по причине слишком большого объема компонентов. Но ее прочтение поможет легче влиться во внутреннее устройство приложения.
Контроллеры – являются точкой инициализации или наследуются от классов Base_Class.
Классы пространства имен Base_Class сочетают в себе обработку данных и обращение к БД.
Модуль - содержит классы таблиц для EF и еще класс ListCollection.
View – разделяется на 3 категории:
- Представления для таблиц (Контроллеры Book, Author и Publisher).Каждый контроллер содержит представления для вывода таблицы(Имя контроллера) ,изменения(EditForm) и добавления(AddForm).
- Базовое представление Index.
- Иные подключаемые представления (Меню, Layout, Пагинация и.т.д).
Контроллеры (за исключением HomeController) находятся в папках Filter , MainTable , SecondTable , что делит их на следующие категории:
Filter – содержит контроллеры для фильтрации.
MainTable – содержит контроллеры для команд CRUD больших по размеру таблиц (Book, Author и Publisher).
SecondTable – содержит контроллеры для команд CRUD малых по размеру таблиц.
Ниже более подробно рассматривается каждая из категорий и контроллер Home.
AuthorSearchController
– контроллер для фильтрации коллекции объектов таблицы Author
. Как и все контроллеры в Filter он наследуется от FilterController
с указанным типом фильтруемых объектов, где в свою очередь создается базовый класс фильтрации FilterContext
, обрабатывающий класс ConcreteFilter
через метод SetFilterResult.ConcreteFilter
с указанным типом фильтруемых объектов служит набором определённых фильтров и имеет методы фильтрации, что и вызываются в action методах.Во время обращения запроса к action методу происходит перенаправление к action TableInvoke
контроллера с именем соответствующим фильтруемому типу.
BookSearchController
и PublisherSearchController
почти аналогичны AuthorSearchController
, только используют другие типы для фильтрации и чуть иначе выполняют обработку запроса на фильтрацию.
Все контроллеры наследуются от TablesBaseDataController
с указанным типом обрабатываемого объекта таблицы, где определяются следующие методы и поля:
AddWithFileCommand tableAndFileControll
– используется для сохранения картинки и таблицы.
protected static ControllerInfo
container – контейнер значений , что являются уникальными для каждого контроллера.
protected abstract ControllerInfo SetContainerValue()
– абстрактный метод для инициализации ControllerInfo значениями.
public string Upload()
– добавляет путь файла и сохраняет его в виде byte массива.
public void RemoveTable(T table)
– удаляет поле равное переданному объекту T table из таблицы.
public ActionResult TableInvoke()
– возвращает представление для вывода на страницу , использует либо данные из фильтрации , либо делает запрос на их выборку
public ActionResult AddForm()
– возвращает представление для добавления поля в таблицу.
public ActionResult EditForm(int id)
- возвращает представление настройки выбранного поля.
public ActionResult SetPagination(ushort page)
– action для настройки страницы пагинации , переопределяет в TableInvoke() для вывода нового результата.
Все контроллеры в MainTable имеют данные поля и методы. По мимо этого в них еще есть AddTable()
и EditTable()
, для изменения поля в таблице или ее добавления.
Все контроллеры наследуются от TablesSecondDataController
с указанным типом обрабатываемого объекта таблицы, где определяются следующие методы и поля:
protected static CommandContext selectContext
– позволяет делать запросы, возвращающие коллекцию объектов таблиц .
protected static CommandVoidContext voidContext
– позволяет делать запросы ничего не возвращающие.
static SearchTableFromContext dbSetType
– по умолчанию принимает метод ,что в зависимости от указанного типа позволяет манипулировать с ним подобной таблицей.
protected List listSecondTables
– сюда передается лист из ListCollection для манипуляции над ним через action методы.
protected Search searchMethod
– хранит метод определяющий тип таблицы в БД.
private JsonResult SetResulst()
– используется для создания CommandVoidContext команд и возврата.
public void AddList()
– добавляет в ListCollection переданный объект.
public void RemoveList()
– удаляет из ListCollection переданный объект.
public JsonResult AddDb()
– добавляет в бд переданный объект.
public JsonResult EditDb()
– изменяет в бд переданный объект.
public JsonResult DeleteDb()
– удаляет в бд переданный объект.
public virtual JsonResult Search()
– виртуальный метод. Производит поиск по переданной строке, может быть переопределен и создана новая реализация поиска.
Все контроллеры MainTable определяют через конструктор все необходимые для работы поля.
Наследуется от TablesData
и определяет action для index , где вызывается TablesData.View()
с переданными значениями размера установленных ViewBag
.Сбрасываются значения ListCollection
и устанавливается страница пагинации на 0.
Интерфейсы:
ICommandVoid
– может быть наследован и использован в CommandVoidContext
для создания запроса не возвращающего значение.
ICommandResult
– может быть наследован и использован в CommandContext
для создания запроса, возвращающего IEnumerable
полей таблиц T. Так же CommandContext
поддерживает асинхронный вариант ICommandResult
- IСommandResultAsync
.
IСommandResultAsync
– может быть наследован и использован в CommandContext
для создания асинхронного запроса возвращающий List
таблиц T.
ICommandSingle
– может быть наследован и использован в CommandSingleContext
для создания запроса возвращающий одно поле таблицы в виде объекта таблицы T.
ITableInclude
- может быть наследован для создания класса управляющего над связанными таблицами.
IFileCommand
- может быть наследован для создания класса управляющего над файлами.
Классы:
CommandContext
- Singleton класс. Создает подключение к бд и передает в ICommandResult
или IСommandResultAsync
контекст EF, возвращая результат запроса. Имеет в себе методы часто вызывающих запросов.
CommandVoidContext
– схож с CommandContext
, только принимает ICommandVoid
и имеет методы самых частых ничего не возвращаемых запросов.
CommandSingleContext
- схож с CommandContext
, только принимает ICommandSingle
и имеет методы самых частых возвращающих только один объект таблицы запросов.
Делегаты:
SearchTableFromContext - использует для определения таблицы из контекста.
IncludeTables - используется для синхронизации объекта таблицы с ее привязанными объектами таблиц.
Классы:
AddCommand
- наследуется от ICommandVoid
и в зависимости от указанного типа с соответствующей таблицей будут происходить манипуляции указанные в EntityState
.
BaseSelectCommad
- частичный класс, предоставляющий общий интерфейс для создания классов унаследованных от ICommandResult
или ICommandResultAsync
.
SelectCommand
- по переданному параметру выборки возвращает либо пагинированый результат, либо все элементы сразу.
SelectCommandAsycn
- асинхронная версия SelectCommand
.
SingleController
- по переданному определению таблицы и id
ищет через отражение таблицу с этим id
в EF и возвращает ее объект.
EditManyToManyCommand
- создает AddManyToManyCommand
и передает туда первый элемент по переданному id
.
AddManyToManyCommand
– добавляет связанные таблицы к главной таблице.
RelatedTableCommand
– позволят управлять связанными объектами-таблиц типа T для таблицы типа A.
AddWithFileCommand
- сохраняет путь и файл в виде байт массива для передачи их в объект класса реализующий IFileCommand
,выполняющий управление с ними.
DefaultEditFile
- сохраняет или добавляет указанный объект таблицы вместе с файлом, если тот не равен null
.
DefaultControllFile
- сохраняет файл по переданному пути и вместе с ним выполняет EntityState
для переданного объекта таблицы.
Классы:
CollectionFilterCommad
- управляет цепочкой возвращаемых фильтрами значений и является суперклассом для всех конкретных реализаций фильтра.
FilterName
- выполняет фильтрацию по строке и передает результат в цепочку CollectionFilterCommad
.
FilterMayny
- производит поиск по связанным таблицам и передает результат в цепочку CollectionFilterCommad
.
FilterSelectController
- содержит лист фильтров и изначальных данных для фильтрации, позволяет добавлять новые фильтры и вызывать их обработку с возвратом последующего результата. Применяется пагинация
Делегаты:
StringFormater
- конвертирует переданный объект таблицы в строку.
Классы:
FilterController
- базовый контроллер, содержащий класс FilterContext
, что при фильтрации принимает класс конкретного набора фильтров.
Интерфейсы:
IFilterPart
- определяет интерфейс для классов, содержащих правила фильтрации. Возвращает лист фильтров.
Классы:
ConcreteFilter
- конкретная реализация правила фильтраций. Возвращает лист фильтров равный правилам фильтрации.
FilterContext
- класс, вызывающий переданные классы правил фильтров, передавая в качестве начального значения IQueryable
запроса таблиц типов T.
Классы:
ReflectionEfId
- статический класс с одним методом, что возвращает Id
переданного объекта T при помощи отражения.
Pagination
– статический класс пагинации . Позволяет по переданному IQueryable
запросу получить от туда takeCount
элементов пропуская объекты относительно номера страницы startPoint
и количества takeCount
. Вычисляет количество страниц при помощи SetPageSize()
.
PanigationFilter
– кэширует изначальный IQueryable
запрос для повторной пагинации фильтрации.
SelectDefault
– набор часто используемых значений делегата SearchTableFromContext
.
Перечисления:
CommandType
– предоставляет выбор либо добавления таблицы, либо ее изменения.
Классы:
TableOperationContext
- абстрактный класс для предоставления метода создающий в зависимости от значения CommandType
либо EditManyToManyCommand
, либо AddManyToManyCommand
соответствующего типа T.
BookOperation
– класс для манипуляции с объектом таблицы Book
.Создает все необходимые значения и передает их в свой суперкласс TableOperationContext
при помощи GetCommand()
.
BookOperation
– класс для манипуляции с объектом таблицы Author
.Создает все необходимые значения и передает их в свой суперкласс TableOperationContext
при помощи GetCommand()
.
Перечисления:
SizeSendViewBag
– предоставляет выбор размера загрузки ViewBag
с различными коллекциями объектов таблиц.
Классы:
TablesSecondDataController
- абстрактный контроллер для предоставления методов CRUD малым по размеру таблицам.
TablesData
– частичный контроллер для передачи всех контекстов работы с БД и методов возвращающих ViewBag
в зависимости от значения SizeSendViewBag
.
TablesBaseDataController
- абстрактный контроллер предоставления методов CRUD крупным по размеру таблицам. Поддерживается пагинация и вариативность значений через структуру ControllerInfo
.
Структуры:
ControllerInfo
– содержит readonly поля для определения у наследуемых от TablesBaseDataController
параметров .
Делегаты:
Search
- позволяет вычленить из контекста БД таблицы с полями соответствующими переданной строке
Классы:
ListCollection
– содержит промежуточные листы для всех малых по размеру таблиц. Данное решение (костыль) было принято чтобы данные не добавлялись сразу в БД , а предварительно находились в виде коллекций. Так это упрощает добавление категорий в большие таблицы.