Примерно неделю назад я наткнулся на GraphQL и был заинтригован тем, что он предлагал, в первую очередь следующим:
- Меньше конечных точек
- Меньше запросов
- Уменьшение избыточной / недостаточной загрузки
- Меньше проблем с управлением версиями
Поработав с парой REST Apis, мне было любопытно, как реализовать GraphQL, и увидеть, чем они отличаются. Я решил использовать ядро .Net и основывать его на предыдущем проекте (Gym Management / CRM), над которым я работал. Посмотреть репо можно на GitHub.
В этом посте я расскажу о настройке проекта и базы данных.
Настраивать:
Я решил создать для этого новый проект, поэтому первым делом нужно создать новое веб-приложение в Visual Studio.
После того, как вы укажете название и местоположение своего приложения, вам нужно будет выбрать API.
Теперь, когда у нас создан основной проект api, мы хотим добавить в решение два дополнительных проекта. Один для нашей модели данных / объектов для извлечения данных, а другой для миграции, чтобы упростить создание и заполнение базы данных (я использовал SQL Express для этого проекта, но он должен работать с любым решением, которое вы выберете). Каждый из этих проектов может быть библиотекой классов.
Теперь, когда наши проекты созданы, нам нужно начать добавлять код. Я решил сначала начать с модели данных. Создайте новый класс и назовите его так, как будет вызываться ваша таблица. Например, мой первый класс назывался «Класс» и будет содержать информацию о типах занятий фитнесом и самообороне.
using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace GraphQL.DataModel { [Table("Class")] public class Class { [Key] public int ClassId { get; set; } public int TypeId { get; set; } [ForeignKey("TypeId")] public Type Type { get; set; } public int LocationId { get; set; } [ForeignKey("LocationId")] public Location Location { get; set; } public string Name { get; set; } } }
Типы внешних ключей и типа / местоположения - это другие таблицы в модели данных, которые можно найти в репо (ссылка в верхней части сообщения).
После того, как мы описали наши таблицы, мы должны добавить класс контекста в наш основной проект API для использования Entity Framework.
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Configuration; using Microsoft.EntityFrameworkCore; using GraphQL.DataModel; namespace GraphQL.Api.Context { public class GraphQLDataContext : DbContext { public GraphQLDataContext() { } public GraphQLDataContext (DbContextOptions<GraphQLDataContext> options) : base(options) { } public DbSet<User> Users { get; set; } public DbSet<Class> Classes { get; set; } public DbSet<Location> Locations { get; set; } public DbSet<DataModel.Type> Types { get; set; } } }
Для каждой таблицы, которая будет в вашей базе данных, должен быть «DbSet». Нам также необходимо обновить Startup.cs, чтобы использовать только что созданный контекст, добавив следующую строку в метод ConfigureServices.
services.AddDbContext<GraphQLDataContext>(options => options.UseSqlServer(settings.ConnectionStrings["graphql"]));
settings.ConnectionStrings [«graphql»] - это строка, определенная в appsettings.Development.json и являющаяся строкой подключения для базы данных.
На этом этапе проект должен быть построен, но мало что даст. Я решил создать миграцию для заполнения базы данных. В проекте Migrations, который мы создали ранее, нам нужно будет добавить NuGets FluentMigrator. Ниже приведены те, которые я добавил для SQL.
После добавления пакетов NuGet мы можем выполнить миграцию.
using System; using System.Collections.Generic; using System.Text; using FluentMigrator; namespace GraphQL.Migrations { [Migration(001)] public class Sprint_1 : Migration { public override void Up() { // Create Tables Create.Table("Class") .WithColumn("ClassId").AsInt32().PrimaryKey().Identity() .WithColumn("TypeId").AsInt32().NotNullable() .WithColumn("LocationId").AsInt32().NotNullable() .WithColumn("Name").AsString(255).NotNullable(); // Populate tables Insert.IntoTable("Class") .Row(new { TypeId = 1, LocationId = 1, Name = "Krav Maga" }) .Row(new { TypeId = 2, LocationId = 1, Name = "Cardio Kickboxing" }) .Row(new { TypeId = 2, LocationId = 1, Name = "Fitness Bootcamp" }); public override void Down() { Delete.Table("Class"); } } }
Теперь мы можем создать проект миграции, чтобы получить .dll, который будет использоваться для заполнения базы данных. Создайте базу данных (я использовал SqlExpress и SSMS), откройте CMD или Powershell и перейдите в каталог с ранее созданной .dll. Например, из корневой папки проекта он должен выглядеть примерно так:
‹?› \ GraphQL.Api \ GraphQL.Migrations \ bin \ Debug \ netcoreapp2.2
Вам нужно будет установить инструмент Fluent migrator, если он еще не установлен, с помощью следующей команды
dotnet tool install -g FluentMigrator.DotNet.Cli
Теперь вы можете запустить миграцию со следующими
dotnet fm migrate -p SqlServer2016 -c "Data Source=.\SQLEXPRESS;Intitial Catalog=<YOUR DB HERE>;Integrated Security=True;" -a <YOUR DLL HERE>"
Миграция должна запуститься, после чего ваша база данных будет заполнена.
В следующем посте я расскажу о добавлении QraphQL в проект и выполнении запросов для получения данных.