Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Эмиль Янгиров "Скаффолдинг — когда делать надо, но лень"

DotNetRu
March 16, 2020

Эмиль Янгиров "Скаффолдинг — когда делать надо, но лень"

DotNetRu

March 16, 2020
Tweet

More Decks by DotNetRu

Other Decks in Education

Transcript

  1. 4

  2. Ребята, мы пишем CRUD • У кого-то проще • У

    кого-то сложнее • Но суть одна 8
  3. Ребята, мы пишем CRUD • У кого-то проще • У

    кого-то сложнее • Но суть одна • Мы выполняем много однотипных действий 9
  4. 10

  5. 13

  6. 15 Скаффолдинг Скаффолдинг — это метод метапрограммирования для создания веб-

    приложений, взаимодействующих с базой данных. Разработчик в них задает спецификации, по которым в дальнейшем генерируется программный код для операций создания определенных записей в базе данных, их чтения, обновления и удаления.
  7. 16

  8. 17 Скаффолдинг Скаффолдинг — инициализация проекта. Обычно это развертывание файловой

    структуры проекта и генерация некоторого количества кода. Скаффолдер — инструмент реализации скаффолдинга.
  9. 18

  10. Ruby on Rails > rails generate scaffold Book body:text shark:references

    На выходе: • модель • миграция БД • контроллер • полный набор представлений для управления стандартными операциями CRUD • шаблоны для партиалов, хелперов и тестов 20
  11. CMS • Orchard CMS • Awesome CMS Core • Cofoundry

    • Lynicon • Squidex https://github.com/thangchung/awesome-dotnet-core#cms 22
  12. ABP FRAMEWORK > dotnet tool install -g Volo.Abp.Cli > abp

    new <solution-name> [options] > abp add-module Volo.Blogging Модули из коробки • Account • Audit Logging • Background Jobs • Blogging • Docs • Feature Management • Identity • Permission Management • Setting Management • Tenant Management • Users 27
  13. steeltoe Actuators, Circuit Breakers, Cloud Foundry, Discovery, DynamicLogger, OAuthConnector, Config

    Server, Placeholder Configuration Source, RandomValue Configuration Source 29
  14. 33 ASP.NET Dynamic Data Вся связь между слоями основана на

    информации о типах из схемы модели данных Настройка метаданных, шаблонов полей, валидации Технология морально устарела Нет интеграции с новомодными фреймворками
  15. 35

  16. 36

  17. А что мы хотим? • модель для БД • набор

    DTO • маппер • репозиторий • сервис • контроллер • тесты (необязательно) 37
  18. А что мы хотим? • модель для БД => /DataAccess/Models/ModelName.cs

    • набор DTO => /Contracts/Models/ModelNameDto.cs • маппер => /BusinessLogic/Mappers/ModelNameProfile.cs • репозиторий => /DataAccess/Repositories/ModelNameRepository.cs • сервис => /BusinessLogic/Services/ServiceName.cs • контроллер => /Api/Controllers/ModelNameController.cs • тесты (необязательно) => /Api.Tests/ModelNameTest.cs 38
  19. dotnet new Cоздает проект/решение/etc на основе указанного шаблона. > dotnet

    new <TEMPLATE> [--dry-run] [--force] [-i|--install] [-lang|--language] [-n|--name] [--nuget-source] [-o|--output] [-u|--uninstall] [--update-apply] [--update-check] [Template options] > dotnet new <TEMPLATE> [-l|--list] [--type] 41
  20. dotnet new — свой шаблон # Создаем простое web-приложение >

    dotnet new web > cd src # Создаем простой шаблон > mkdir template/.template.config > cd template/.template.config > nano template.json https://github.com/dotnet/aspnetcore/tree/master/src/ProjectTemplates https://github.com/dotnet/templating/wiki/Available-templates-for-dotnet-new 42
  21. dotnet new — файл шаблона { "$schema": "http://json.schemastore.org/template", "author": "Emil

    Yangirov", "classifications": [ "Common", "Code" ], "identity": "UfaDotNet", "name": "UfaDotNet Model", "shortName": "model", "tags": { ... }, "symbols": { ... }, "sources": { ... }, "postActions": { ... } } 44
  22. dotnet new — переменные "symbols": { "ModelName": { "type": "parameter",

    "replaces": "{ModelName}", "FileRename": "ModelName" }, "DbTableName": { "type": "parameter", "replaces": "{DbTableName}" }, "WithTest": { "type": "parameter", "datatype": "bool", "description": "Генерация тестов" , "defaultValue" : "false" } } 45
  23. dotnet new — переменные namespace DataAccess.Models ModelName.cs { public class

    {ModelName} : IBaseEntity<int> { public int Id { get; set; } public int Identifier => Id; } } namespace Contracts.Models ModelNameDto.cs { public class {ModelName}Dto : IDto<int> { public int Id { get; set; } } } 46
  24. dotnet new — условия "sources": [ { "modifiers": [ {

    "condition": "(!WithTest)", "exclude": [ "Api.Tests/ModelNameTest.cs" ] } ] } ] 48
  25. dotnet new — post-actions "postActions": [ { "condition": "true", "description":

    "Ending", "manualInstructions": [ { "text": "Ура! Вы дошли до конца." } ], "actionId": "30C66942-E0B6-4F7C-9008-378DCD16E600", "continueOnError": true } ] 49
  26. dotnet new — how to use > dotnet new -i

    .\ Templates Short Name Language Tags ------------------------------------ ----------------------------- UfaDotNet Model model [C#] Common/Code > dotnet new model --ModelName=Book --DbTableName=Books --ServiceName=BookService --WithTest=true The template "UfaDotNet Model" was created successfully. Processing post-creation actions... Description: Ending Manual instructions: Ура! Вы дошли до конца. 50
  27. 51

  28. 53 dotnet new [ROADMAP] • Создание официальной документации • Интерактивный

    режим (как в yo aspnet) • Интеграция с Visual Studio • Интеграция с yo aspnet • Обновления шаблонов (как обязательные, так и необязательные) https://github.com/dotnet/templating/#roadmap
  29. А что мы хотим? • модель для БД • набор

    DTO • маппер • репозиторий • сервис • контроллер • тесты (необязательно) 54
  30. А что мы хотим? • модель для БД => /DataAccess/Models/ModelName.cs

    • набор DTO => /Contracts/Models/ModelNameDto.cs • маппер => /BusinessLogic/Mappers/ModelNameProfile.cs • репозиторий => /DataAccess/Repositories/ModelNameRepository.cs • сервис => /BusinessLogic/Services/ServiceName.cs • контроллер => /Api/Controllers/ModelNameController.cs • тесты (необязательно) => /Api.Tests/ModelNameTest.cs 55
  31. Yeoman > sudo npm i -g yo > yo generator-name

    Универсальный скаффолдер, позволяющий создавать любые приложения. Предоставляет так называемые «генераторы», которые можно вызывать с помощью команды yo, чтобы сгенерировать структуру приложения. 57
  32. Yeoman Генератор — это npm-пакет с инструкциями и шаблонами для

    Yo, которые описывают инициализацию проекта: какие директории создать, какие файлы и куда копировать, каким образом обрабатывать шаблоны и куда их разместить после обработки. 58
  33. generator-aspnet [deprecated] > npm i -g generator-aspnet > dev yo

    aspnet > yo aspnet:Class Book https://github.com/OmniSharp/generator-aspnet https://github.com/jhipster/jhipster-dotnetcore 59
  34. 60 Yeoman — свой генератор { package.json "name": "generator-ufadotnet", "version":

    "0.1.0", "description": "UfaDotNet simple scaffold" , "files": [ "generators" ], "main": "generators/app/index.js" , "keywords": ["yeoman-generator"], "dependencies": { "yeoman-generator": "^1.0.0" } }
  35. Yeoman — свой генератор var Generator = require('yeoman-generator'); index.js var

    prompts = require('./prompts'); var writeFiles = require('./writing'); module.exports = class extends Generator { prompting() { return this.prompt(prompts).then((props) => { this.props = props; }); } writing() { writeFiles.call(this); } } 63
  36. Yeoman — параметры module.exports = [ prompts.js { type: 'input',

    name: 'modelName', message: 'Название модели', default: 'Model' }, ... { type: 'confirm', name: 'withTests', message: 'Генерировать тесты?', default: true } ] 64
  37. module.exports = function () { writing.js let {modelName, withTests} =

    this.props; this.fs.copyTpl( this.templatePath('ModelName.cs'), this.destinationPath(`DataAccess/Models/${modelName}.cs`), { ModelName: modelName } ); if (withTests) { this.fs.copyTpl( this.templatePath('ModelNameTest.cs'), this.destinationPath(`Api.Tests/${modelName}Test.cs`), { ModelName: modelName } ); } }; 65
  38. Yeoman — переменные namespace DataAccess.Models ModelName.js { public class <%=ModelName%>

    : IBaseEntity<int> { public int Id { get; set; } public int Identifier => Id; } } namespace Contracts.Models ModelNameDto.js { public class <%=ModelName%>Dto : IDto<int> { public int Id { get; set; } } } 66
  39. Yeoman — свой генератор var Generator = require('yeoman-generator'); index.js var

    prompts = require('./prompts'); var writeFiles = require('./writing'); module.exports = class extends Generator { prompting() { return this.prompt(prompts).then((props) => { this.props = props; }); }, writing() { writeFiles.call(this); } } 67
  40. 68

  41. 69 Yeoman Удобная разбивка на модули Передача переменных, условий Возможность

    создавать вопросы Много кода на JavaScript Неудобный плейсмент файлов