Данный проект нацелен на ведение учета книг (СУБД). За его реализацию мною было принято взяться после завершения прошлого проекта и получением более глубоких знаний в ООП и 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 – содержит промежуточные листы для всех малых по размеру таблиц. Данное решение (костыль) было принято чтобы данные не добавлялись сразу в БД , а предварительно находились в виде коллекций. Так это упрощает добавление категорий в большие таблицы.