Примерно неделю назад я наткнулся на GraphQL и был заинтригован тем, что он предлагал, в первую очередь следующим:

  1. Меньше конечных точек
  2. Меньше запросов
  3. Уменьшение избыточной / недостаточной загрузки
  4. Меньше проблем с управлением версиями

Поработав с парой 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 в проект и выполнении запросов для получения данных.