Універсальна система керування даними на базі технологій скаффолдина і платформи .NET Core

Кілька років тому я реалізував ряд проектів, для управління якими використовувалася система управління заснована на ASP.NET Dynamic Data. У свій час ця система заощадила досить багато часу і ресурсів. Але як відомо, в ІТ все розвивається дуже стрімко. Не так давно вийшла у реліз платформа .NET Core, основним нововведенням якої була підтримка кроссплатформенности. Це в свою чергу дозволило мені мігрувати ряд невеликих проектів, а також проектів, які я підтримую на некомерційній основі на бюджетні сервера від Digital Ocean, які, як відомо, підтримують тільки ОС сімейства Linux. Коли справа дійшла до системи управління переді мною стояв вибір — з мінімальною зміною коду портувати проект під Mono, або переписати з нуля використовую нові можливості .NET Core. Зваживши всі за і проти, я вибрав другий варіант. Що з цього вийшло і що я збираюся отримати ви можете дізнатися під катом.


Для тих хто не в курсі, що таке скаффолдинг, короткий опис цього підходу:
"Скаффолдинг — це метод метапрограммирования для створення веб-додатків, взаємодіючих з базою даних. Цей метод підтримується деякими сучасними MVC-фреймворками (Grails, Yii, Ruby on Rails, Django, CakePHP, Phalcon PHP, Symfony, ASP.NET Dynamic Data та іншими.). Розробник у них задає специфікації, за якими в подальшому генерується код для операцій створення певних записів в базі даних, читання, оновлення та видалення."[1]
Надихнувшись прикладом Ruby on Rail у 2007 році компанія Microsoft розробила свій інструмент для швидкого проектування веб-додатки працюють з даними.
"ASP.NET Dynamic Data – це фреймворк, який дозволяє швидко розробляти повнофункціональні data-driven додатки, використовуючи LINQ to SQL або Entity Framework, а також розширює можливості елементів управління DetailsView, FormView, GridView і ListView в плані функціональності, перевірки даних і відображення.
Якщо говорити по простому, то Dynamic Data призначений для швидкої генерації фронт-ендів для баз даних Microsoft SQL Server."[2]
І сам підхід та інструмент ASP.NET Dynamic Data мені сподобалися. Причому на стільки, що, як я вже писав вище, я створив свою систему на їх основі. Проте, за час використання цього рішення у мене появляли різні ідеї про те, як можна було б поліпшити цей продукт. І так, до того, щоб переписати проект з нуля мене підштовхнув ряд недоліків рішення на базі ASP.NET Dynamic Data, серед яких основні:
  • Побудова моделі не напряму з бази даних, а за згенерованої моделі Entity Framework, що в свою чергу спричиняє необхідність перекидання проекту, що містить модель у разі зміни структури бази.
  • Проект був заснований на застарілій на сьогоднішній день технології WebForms
  • Підтримувався тільки SQL Server
Виходячи з цих недоліків я виділив для себе ряд можливостей, які я б хотів реалізувати в новому проекті:
  • Підтримка кроссплатформенности
  • Підтримка різних баз даних (на даний момент реалізована підтримка SQL Server і йде робота над реалізацією підтримки MySQL. У планах також: PostgreSQL, Oracle Database, SQLite).
  • Генерація моделі бази даних безпосередньо з бази.
  • Lookup з розширеними можливостями пошуку

Загальний принцип роботи системи

На даний момент вже написана основна частина коду, яка дозволяє працювати з даними нескладних за структурою баз.
Процедура роботи наступна:
  1. Для бази даних створюється робоча директорія, яка вказується у відповідному файлі конфігурації програми.
  2. В цій директорії створюється файл з інформацією про параметри підключення до бази і параметри підключення до файлового сховища, а також конфігуруються облікові записи користувачів системи.
  3. Далі, після першого запуску системи, користувач переходить у розділ Administration і запускає процес побудови моделі бази даних, яка буде збережена в робочу директорію файл db.json.
  4. Після того, як модель побудована, в принципі, з системою можна вже працювати. Однак для повністю комфортної роботи може знадобитися уточнити параметри деяких полів. Щоб спростити процедуру підтримки конфігураційного файлу в майбутньому, я передбачив можливість описувати уточнену конфігурацію в окремому файлі db_ex.json. Це файл за структурою аналогічний db.json, але в ньому необхідно вказати тільки ім'я поля, яке вимагає додаткової настройки і вказати ті параметри, які відрізняються від згенерованих за замовчуванням. Розбиття конфігурації на два готельних файлу дозволяє не турбуватися про те, що якщо в майбутньому доведеться оновити модель даних то все кастомні налаштування будуть втрачені. А це може статися, наприклад, якщо в таблицю були додані нові поля, або була створена нова таблиця в базі.

Конфігурація
  • db.json – файл з описом схемын бази даних
  • db_ex.json – файл з розширеним опису схеми. Дозволяє перекрити типи полів та іншу мета-інформацію.
  • configuration.json – файл містить інформацію про підключення до бази даних, користувачам системи та інформацію для підключення до файлових сховищ

Структура опису бази описані нижче.
Схема
  • Name – системне назву схеми.
  • Title – заголовок. Відображається в інтерфейсі системи
  • Tables – список таблиць
Таблиця
  • ShowInList – параметр вказує, чи буде відображатися таблиця в навігаційному меню
  • Name – ваше ім'я таблиці. Відповідає імені таблиці в базі даних.
  • Title – заголовок таблиці. Оторажется в навігаційному меню і на сторінці редагування таблиці.
  • Description – опис. Відобразиться на сторінці редагування таблиці
  • Columns – список полів
Поле
  • Position – позиція поля в гріді та редакторі.
  • IsKey – є поле ключовим полем в базі даних
  • IsNullable – допустимі чи NULL-значення у полі
  • Reference – ...
  • ShowInGrid – відображати, або не поле у списку
  • AutoIncrement – є поле автоінкрементний
  • MaxValue – максимальне значення поля
  • MinValue – максимальне значення поля
  • MaxLength – максимальна довжина поля
  • Readonly – є поле доступним тільки для читання
  • Type – тип поля
  • Name – системне назва поля, що відповідає ім'я поля таблиці бази даних
  • Title – назва поля, тображается в редакторі і гріді
  • Description – опис поля
Підтримка типів даних

На даний момент в системі передбачені (але ще не всі реалізовані) такі редактори для різних типів полів:
  • Text — звичайне текстове поле
  • Email — поле для введення поштової адреси
  • Url — поле для введення url
  • Phone — поле для введення телефону
  • HTML — поле містить повноцінний WYSIWYG редактор.
  • Password — поле для введення пароля
  • Date — поле для вводу дати
  • Time — поле для вводу часу
  • DateTime — поле для введення дати та часу
  • File — поле для завантаження файлу та збереження ідентифікатора завантаженого файлу в таблицю
  • Integer — поле для введення цілих чисел
  • Double — поле для введення дробових чисел
  • Image — поле для завантаження зображення, завантажите зображення попереднього перегляду і збереження ідентифікатора завантаженого зображення в таблицю
  • Binary — поле для завантаження файлу та збереження вмісту в таблицю,
  • Reference — випадаючий список, або спливаюче вікно з можливістю пошуку для вибору пов'язаного значення
  • Boolean — чекбокс

Приклад файлу конфігурації db.json
{
"Tables": [ 
{
"Columns": [
{
"Position":1,
"IsKey": true,
"IsNullable": false,
"Reference": null,
"ShowInGrid": false,
"AutoIncrement": true,
"MaxValue": null,
"MinValue": null,
"MaxLength": null,
"Readonly": true,
"Type": 40,
"Name": "Id",
"Title": "Id",
"Description": "" 
},
{
"Position": 2,
"IsKey": true,
"IsNullable": false,
"Reference": null,
"ShowInGrid": false,
"AutoIncrement": true,
"MaxValue": null,
"MinValue": null,
"MaxLength": null,
"Readonly": true,
"Type": 40,
"Name": "Name",
"Title": "Name",
"Description": "" 
},
{
"Position": 3,
"IsKey": true,
"IsNullable": false,
"Reference": null,
"ShowInGrid": false,
"AutoIncrement": true,
"MaxValue": null,
"MinValue": null,
"MaxLength": null,
"Readonly": true,
"Type": 40,
"Name": "Value",
"Title": "Value",
"Description": "" 
}
],
"ShowInList": false,
"Name": "Setting",
"Title": "Налаштування",
"Description": "Системні налаштування"
}
],
"Generated": "2016-09-27T00:40:48.9189786+03:00",
"ExtendedConfigurationLoaded": false,
"Name": "Database",
"Title": "Database" 
}

Приклад файлу конфігурації db_ex.json
{
"Tables": [ 
{
"Columns": [
{
"Type": 40,
"ShowInGrid": false,
"AutoIncrement": true, 
"Readonly": true,
"Name": "Id",
"Title": "Системний ідентифікатор" 
},
{
"Type": 10, 
"Name": "Name",
"Title": "Назву" 
},
{
"Type": 10, 
"Name": "Value",
"Title": "Значення" 
}
],
"ShowInList": false,
"Name": "Setting",
"Title": "Налаштування",
"Description": "Системні налаштування"
}
],
"Name": "Опис проекту",
"Title": "База даних" 
}

Приклад файлу конфігурації configuration.json
{
"ConnectionString": "Server=...;Database=...;User Id=...;Password=..;",
"SecretKey": "secret-key-123",
"ApplicationRestartCommand": "",
"StorageConfiguration": {
"Type": 0,
"Url": "http://static.exapmle.com/user_upload/",
"Connection": {
"Path": "/var/www/example.com/user_upload/"
}
},
"Users": [{
"Login": "admin",
"Password": "admin",
"Administrator": true
} 
]
}

Файлові сховища

  • FileSystem – найбільш частий варіант, коли файлове сховище розташовується на тому ж сервері, де запущена система управління. У цьому випадку указаывается шлях до файлу.
  • FTP – файлове сховище розташований на віддаленому сервері, завантаження файлів відбувається по протоколу FTP(реалізація в планах)
  • AzureStorage – файлове сховище розташований у Microsoft Azure, завантаження файлів проводиться в Azure Blob Storage (реалізація в планах)
  • SSH – файлове сховище розташований на віддаленому сервері, завантаження файлів здійснюється по SSH-протоколу (реалізація в планах)
У планах також реалізація інтеграції з сховищем Amazon S3.

Післямова

Хочу висловити подяку gelas за допомогу в роботі над проектом та здорову критику.
Окремо хочу зазначити, що проект створювався мною в рамках ком'юніті українських розробників .NET Core — .NET Core Ukrainian User Group. На даний момент найбільша активність учасників спостерігається в групі в Facebook, але і групу в ВК ми також плануємо наповнювати. Якщо у вас є питання .NET Core, ідеї якими ви хочете поділитися, або ви тільки придивляєтеся до цієї технології – приєднуйтесь, буде цікаво!
Проект доступний під ліцензією MIT на GitHub.


  1. Посібник ASP.NET Dynamic Data.
  2. Википедия. Скаффолдинг.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.