GraphQL في C# (.NET): مراجعة المكتبات والأدوات
GraphQL هي لغة استعلام لـ API تتيح للعملاء طلب البيانات التي يحتاجونها فقط. في نظام C# (.NET)، توجد عدة مكتبات قوية لتنفيذ خوادم وعملاء GraphQL. في هذه المقالة، سنستعرض الأكثر شيوعًا: Hot Chocolate و GraphQL.NET. كلتا المكتبتين تتطوران بنشاط، ولديهما كود مفتوح المصدر ووثائق ممتازة.
1. Hot Chocolate — إطار عمل حديث من ChilliCream
Hot Chocolate هو إطار عمل GraphQL كامل الميزات لـ .NET، يدعم كلاً من جانب الخادم والعميل. يتكامل مع ASP.NET Core و Entity Framework Core، ويوفر سمات مريحة وتوليد تلقائي للمخطط.
التثبيت وخادم أساسي
للبدء، قم بتثبيت الحزمة عبر NuGet:
dotnet add package HotChocolate.AspNetCoreأنشئ خادم GraphQL بسيط:
// تعريف نوع البيانات
public class Book
{
public string Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
}
// إنشاء فئة Query
public class Query
{
public Book GetBook() =>
new Book
{
Id = "1",
Title = "الحرب والسلام",
Author = "ليو تولستوي"
};
}
// الإعداد في Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddGraphQLServer()
.AddQueryType<Query>();
var app = builder.Build();
app.MapGraphQL();
app.Run();
بعد التشغيل، سيكون الخادم متاحًا على العنوان /graphql. يمكنك إرسال استعلام عبر أي عميل GraphQL:
{
book {
title
author
}
}
يدعم Hot Chocolate الطفرات، الاشتراكات، التصفية، الترتيب، التقسيم إلى صفحات، والتكامل مع Entity Framework عبر UseProjection و UseFiltering و UseSorting.
مثال مع طفرة
public class Mutation
{
public Book AddBook(string title, string author) =>
new Book { Id = Guid.NewGuid().ToString(), Title = title, Author = author };
}
// التسجيل
builder.Services
.AddGraphQLServer()
.AddQueryType<Query>()
.AddMutationType<Mutation>();
2. GraphQL.NET — مكتبة خفيفة ومثبتة عبر الزمن
GraphQL.NET (المعروفة أيضًا باسم graphql-dotnet) هي نسخة منفذة من تطبيق GraphQL الأصلي بلغة JavaScript إلى C#. توفر بناء يدوي للمخطط عبر الأنواع والحقول، مما يمنح تحكمًا كاملاً في هيكل API.
التثبيت ومثال
dotnet add package GraphQL
dotnet add package GraphQL.SystemTextJson
dotnet add package GraphQL.Server.Transports.AspNetCore
لننشئ خادمًا بسيطًا:
// تعريف النوع
public class BookType : ObjectGraphType<Book>
{
public BookType()
{
Field(x => x.Id);
Field(x => x.Title);
Field(x => x.Author);
}
}
// إنشاء المخطط
public class AppSchema : Schema
{
public AppSchema(IServiceProvider provider) : base(provider)
{
Query = provider.GetRequiredService<BookQuery>();
}
}
// Query
public class BookQuery : ObjectGraphType
{
public BookQuery()
{
Field<BookType>("book")
.Resolve(context => new Book
{
Id = "1",
Title = "الجريمة والعقاب",
Author = "ف.م. دوستويفسكي"
});
}
}
// إعداد Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<BookQuery>();
builder.Services.AddSingleton<AppSchema>();
builder.Services.AddGraphQL(b => b.AddSystemTextJson());
var app = builder.Build();\