وظائف Serverless بلغة C#: AWS Lambda — من الأساسيات إلى المستوى المتقدم
\n\nأصبحت بنية Serverless جزءًا لا يتجزأ من عالم التطوير الحديث. إذا كنت قد أتقنت بالفعل بناء الجملة الأساسي لإنشاء وظائف AWS Lambda بلغة C#، فقد حان الوقت للانتقال إلى المستوى التالي. في هذه المقالة، سنستعرض التقنيات المتقدمة: حقن التبعيات (DI)، إنشاء Middleware، العمل مع الأسرار والأنماط غير المتزامنة. ستساعدك هذه المعرفة على كتابة كود أكثر مرونة وقابلية للاختبار وأعلى أداء للحلول السحابية.
\n\n1. حقن التبعيات (DI) في AWS Lambda بلغة C#
\n\nغالبًا ما ينشئ النمط القياسي لوظيفة Lambda مثيلًا جديدًا من فئة المعالج لكل استدعاء. يؤدي هذا إلى إعادة إنشاء الكائنات "الثقيلة" (مثل عملاء قاعدة البيانات أو عملاء HTTP). استخدام حاوية حقن التبعيات (DI) يحل هذه المشكلة، مما يسمح بإعادة استخدام المثيلات وإدارة عمرها الافتراضي.
\n\nلتنفيذ DI في .NET 8+ لـ Lambda، يتم استخدام الحزمة Amazon.Lambda.AspNetCoreServer.Hosting. دعنا نلقي نظرة على مثال لإعداد DI باستخدام IServiceCollection.
مثال: إعداد DI في Lambda
\n\nusing Amazon.Lambda.Core;\nusing Amazon.Lambda.RuntimeSupport;\nusing Amazon.Lambda.Serialization.SystemTextJson;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\n\n// الواجهة وتنفيذ الخدمة\npublic interface IWeatherService\n{\n string GetForecast(string city);\n}\n\npublic class WeatherService : IWeatherService\n{\n public string GetForecast(string city) => $"الطقس في {city}: +25°C، مشمس";\n}\n\n// معالج Lambda\npublic class Function\n{\n private readonly IWeatherService _weatherService;\n\n public Function() : this(Startup.CreateHostBuilder().Build()) { }\n\n public Function(IHost host)\n {\n _weatherService = host.Services.GetRequiredService<IWeatherService>();\n }\n\n public async Task<string> FunctionHandler(string input, ILambdaContext context)\n {\n return _weatherService.GetForecast(input);\n }\n}\n\n// فئة التهيئة\npublic static class Startup\n{\n public static IHostBuilder CreateHostBuilder() =>\n Host.CreateDefaultBuilder()\n .ConfigureServices((context, services) =>\n {\n services.AddSingleton<IWeatherService, WeatherService>();\n // أضف خدمات أخرى هنا\n });\n}\n\nهام: استخدم AddSingleton لعملاء AWS SDK (S3, DynamoDB) و AddTransient للخدمات خفيفة الوزن. هذا يقلل من وقت "البداية الباردة" (cold start) ويوفر الموارد.
2. Middleware في AWS Lambda: سلسلة معالجة الطلبات
\n\nمفهوم Middleware، المألوف من ASP.NET Core، ينطبق بشكل ممتاز على وظائف Lambda أيضًا. يسمح Middleware بإضافة منطق شامل: التسجيل، معالجة الأخطاء، المصادقة، ضغط الردود — دون تغيير الكود الأساسي للمعالج.
\n\nلتنفيذ Middleware، يتم استخدام الحزمة Amazon.Lambda.AspNetCoreServer والواجهة ILambdaMiddleware (أو تنفيذ مخصص). فيما يلي مثال لإنشاء Middleware بسيط لتسجيل وقت التنفيذ.
مثال: Middleware للتسجيل
\n\nusing Amazon.Lambda.Core;\nusing System.Diagnostics;\n\npublic class LoggingMiddleware : ILambdaMiddleware\n{\n public async Task<TResponse> InvokeAsync<TRequest, TResponse>(TRequest request, \n Func<TRequest, Task<TResponse>> next, ILambdaContext context)\n {\n var sw = Stopwatch.StartNew();\n context.Logger.LogInformation($"تم استلام الطلب: {request}");\n\n try\n {\n var response = await next(request);\n sw.Stop();\n context.Logger.LogInformation($"تم إرسال الرد بعد {sw.ElapsedMillis