مكتبة GraphQL لـ C# (.NET): GraphQL.NET
GraphQL هي لغة استعلام حديثة لـ API، تتيح للعملاء طلب البيانات الضرورية فقط، مما يقلل التكرار ويسرع أداء التطبيقات. لمنصة .NET توجد مكتبة قوية GraphQL.NET، تسمح لمطوري C# بإنشاء أجزاء خادم متوافقة تمامًا مع مواصفات GraphQL. في هذه المقالة سنشرح بالتفصيل إمكانياتها ومزاياها وسنقدم أمثلة عملية.
ما هو GraphQL.NET؟
GraphQL.NET هي مكتبة مفتوحة المصدر لـ C# (.NET)، تنفذ مواصفات GraphQL. توفر أدوات لتعريف المخططات (الأنواع، الاستعلامات، التحويرات والاشتراكات)، معالجة الاستعلامات الواردة، التحقق من الصحة وتنفيذ المنطق. المكتبة مدعومة بنشاط من المجتمع وتُستخدم في بيئات الإنتاج.
الميزات الرئيسية:
- تعريف مخطط مرن — الأنواع، الواجهات، أنواع الاتحاد والتعدادات.
- دعم الاستعلامات (Query)، التحويرات (Mutation) والاشتراكات (Subscription).
- التكامل مع حاويات DI (مثل Microsoft.Extensions.DependencyInjection).
- التحقق من الصحة والتحليل للاستعلامات على جانب الخادم.
- دعم DataLoader لتحسين استعلامات N+1.
- أدوات للاختبار وتصحيح الأخطاء.
التثبيت والإعداد
يتم التثبيت عبر NuGet Package Manager. نفذ الأمر:
dotnet add package GraphQLdotnet add package GraphQL.SystemTextJsonلـ ASP.NET Core ستحتاج أيضًا إلى حزمة middleware:
dotnet add package GraphQL.Server.Transports.AspNetCoreإنشاء GraphQL API بسيط
1. تعريف أنواع البيانات
أولاً، لننشئ نموذج البيانات ونوع GraphQL المقابل:
public class Book{ public int Id { get; set; } public string Title { get; set; } public string Author { get; set; }}
public class BookType : ObjectType<Book>{ protected override void Configure(IObjectTypeDescriptor<Book> descriptor) { descriptor.Field(b => b.Id).Type<NonNullType<IntType>>(); descriptor.Field(b => b.Title).Type<NonNullType<StringType>>(); descriptor.Field(b => b.Author).Type<StringType>(); }}2. تعريف الاستعلامات (Query)
الآن لننشئ كلاس Query الذي سيعالج الاستعلامات:
public class Query{ private readonly List<Book> _books = new() { new Book { Id = 1, Title = "1984", Author = "George Orwell" }, new Book { Id = 2, Title = "Brave New World", Author = "Aldous Huxley" } };
public Book GetBook(int id) { return _books.FirstOrDefault(b => b.Id == id); }
public List<Book> GetBooks() { return _books; }}ثم نسجل هذا الكلاس في المخطط:
public class BookSchema : Schema{ public BookSchema(IServiceProvider provider) : base(provider) { Query = provider.GetRequiredService<Query>(); }}3. الإعداد في Startup.cs
نضيف الخدمات و middleware في ASP.NET Core:
public void ConfigureServices(IServiceCollection services){ services.AddGraphQL(builder => builder .AddSchema<BookSchema>() .AddSystemTextJson());}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env){ app.UseGraphQL<BookSchema>(); app.UseGraphQLPlayground(); // للاختبار}التحويرات (Mutation) لتعديل البيانات
لنضف إمكانية إضافة كتب عبر التحويرات: