- ایجاد پروژه جدید : ابتدا یک پروژه جدید ASP.NET Core Web API ایجاد کنید:
پس از ایجاد
یک پوشه جدید با نام Data ایجاد میکنیم که می خواهیم تمام کدهای مربوط به پایگاه داده خود را در آن قرار دهیم.
- ایجاد مدل Speaker.cs در پوشه Data :
با استفاده از کد زیر یک فایل جدید Speaker.cs
در دایرکتوری Data
اضافه کنید :
using System.ComponentModel.DataAnnotations;
namespace ConferencePlanner.GraphQL.Data
{
public class Speaker
{
public int Id { get; set; }
[Required]
[StringLength(200)]
public string Name { get; set; }
[StringLength(4000)]
public string Bio { get; set; }
[StringLength(1000)]
public virtual string WebSite { get; set; }
}
}
- پیکر بندی Sqlite :
- پکیج های زیر از NuGet دریافت و نصب میکنیم :
Microsoft.EntityFrameworkCore.Sqlite
Microsoft.EntityFrameworkCore.Tools
- یک Entity Framework DbContext جدید با نام کلاس ApplicationDbContext.cs در پوشه Data ایجاد میکنیم:
using Microsoft.EntityFrameworkCore;
namespace ConferencePlanner.GraphQL.Data
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<Speaker> Speakers { get; set; }
}
}
- پیکر بندی Startup.cs :
در Startup.cs خط کد زیر را به سرویس ها اضافه میکنیم
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlite("Data Source=conferences.db"));
- پیکر بندی EF Migrations :
در Visual Studio، Tools -> NuGet Package Manager -> Package Manager Console را انتخاب کنید.
دستورات زیر را جهت Migration و آپدیت دیتابیس در Package Manager Console اجرا کنید
Add-Migration Initial
Update-Database
- اضافه کردن GraphQL :
- پکیج زیر را از NuGet دریافت نمایید:
HotChocolate.AspNetCore
- در مرحله بعد ما نوع ریشه پرس و جو خود ( Query.cs) را در پوشه Data ایجاد می کنیم و resolver اضافه می کنیم که همه speakers ما را واکشی کند.
using System.Linq;
using HotChocolate;
using ConferencePlanner.GraphQL.Data;
namespace ConferencePlanner.GraphQL
{
public class Query
{
public IQueryable<Speaker> GetSpeakers([Service] ApplicationDbContext context) =>
context.Speakers;
}
}
- قبل از اینکه بتوانیم کاری با نوع ریشه پرس و جو خود انجام دهیم، باید GraphQL را راه اندازی کنیم و نوع ریشه پرس و جو خود را ثبت کنیم. کد زیر را در متد Startup.cs اضافه کنید.
services
.AddGraphQLServer()
.AddQueryType<Query>();
- در مرحله بعد باید میان افزار GraphQL خود را پیکربندی کنیم تا سرور بداند که چگونه درخواست های GraphQL را اجرا کند. برای این کار app.UseEndpoints…کد زیر را در Startup.cs اضافه میکنیم.
app.UseEndpoints(endpoints =>
{
endpoints.MapGraphQL();
});
اکنون Startup.cs ما باید به این شکل باشد.
using ASPNetCoreGraphQL.GraphQl;
using ASPNetCoreGraphQL.GraphQl.Data;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlite("Data Source=conferences.db"));
builder.Services
.AddGraphQLServer()
.AddQueryType<Query>()
.AddMutationType<Mutation>(); ;
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGraphQL();
});
app.Run();
حال پروژه را اجرا نمایید و می بایست بعد از ورود به آدرس زیر پروژه ذیل نمایش داده شود.
https://localhost:7266/graphql
برای بررسی نوع برگشتی فیلد speakers ، روی schema explorer کلیک کنید و روی فیلد speakers کلیک کنید .
توجه: ممکن است مجبور شوید طرح را دوباره بارگیری کنید، می توانید این کار را با کلیک کردن روی دکمه refresh در گوشه سمت راست بالا انجام دهید.
- اضافه کردن Mutation :
بنابراین، تا کنون نوع ریشه Query را به طرح خود اضافه کردهایم که به ما امکان میدهد از speakers پرس و جو کنیم. با این حال، در این مرحله، هیچ راهی برای افزودن یا تغییر داده وجود ندارد. در این بخش قصد داریم تا نوع root Mutation را اضافه کنیم تا speakers جدیدی به پایگاه داده خود اضافه کنیم.
برای Mutation از الگوی Relay Mutation استفاده میکنیم که معمولاً در GraphQL استفاده میشود.
یک جهش از سه جزء تشکیل شده است، Input ، Payload و خود Mutation
در این مورد ما می خواهیم یک Mutation به نام ایجاد کنیم addSpeaker
، طبق قرارداد، جهش ها به عنوان فعل نامگذاری می شوند، ورودی های آنها نامی است که در انتها “Input” ضمیمه شده است، و آنها یک شی است که نام آن با “Payload” اضافه شده است.
بنابراین، برای addSpeaker
جهش خود، دو نوع ایجاد می کنیم AddSpeakerInput
و AddSpeakerPayload
:
- AddSpeakerInput.csبا کد زیر یک فایل به پروژه خود اضافه کنید :
namespace ConferencePlanner.GraphQL
{
public record AddSpeakerInput(
string Name,
string Bio,
string WebSite);
}
ورودی و خروجی (بارگذاری بار) هر دو حاوی یک شناسه جهش مشتری هستند که برای تطبیق درخواست ها و پاسخ ها در برخی از چارچوب های مشتری استفاده می شود.
- سپس ما را اضافه می کنیم
AddSpeakerPayload
که خروجی جهش GraphQL ما را با افزودن کد زیر نشان می دهد:
using ConferencePlanner.GraphQL.Data;
namespace ConferencePlanner.GraphQL
{
public class AddSpeakerPayload
{
public AddSpeakerPayload(Speaker speaker)
{
Speaker = speaker;
}
public Speaker Speaker { get; }
}
}
- حالا بیایید نوع جهش واقعی را با
addSpeaker
جهش خود در آن اضافه کنیم.
using System.Threading.Tasks;
using ConferencePlanner.GraphQL.Data;
using HotChocolate;
namespace ConferencePlanner.GraphQL
{
public class Mutation
{
public async Task<AddSpeakerPayload> AddSpeakerAsync(
AddSpeakerInput input,
[Service] ApplicationDbContext context)
{
var speaker = new Speaker
{
Name = input.Name,
Bio = input.Bio,
WebSite = input.WebSite
};
context.Speakers.Add(speaker);
await context.SaveChangesAsync();
return new AddSpeakerPayload(speaker);
}
}
}
- حال در program.cs باید
Mutation
services
.AddGraphQLServer()
.AddQueryType<Query>()
.AddMutationType<Mutation>();
- تست خروجی :
- اکنون باید یک نوع Query به نام Speacker و یک Mutation به نام addSpeaker وجود داشته باشد.
- سپس با نوشتن یک جهش GraphQL یک Speaker اضافه کنید.
mutation AddSpeaker {
addSpeaker(input: {
name: "Speaker Name"
bio: "Speaker Bio"
webSite: "http://speaker.website" }) {
speaker {
id
}
}
}
- نام همه Speackers پایگاه داده را جویا شوید.
query GetSpeakerNames {
speakers {
name
}
}
- سورس کد پروژه در آدرس ذیل قابل دریافت می باشد :