C# Academy · درس

سلوكيات مسار المعالجة

أضيفوا منطقًا مشتركًا باستخدام السلوكيات

الدرس 3 من 413 خطوة

سلوكيات مسار المعالجة درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.

الاهتمامات المشتركة بين الجوانب

تنطبق عمليات التسجيل والتحقق وقياس الوقت والمعاملات على العديد من المعالجات. ويؤدي نسخ هذه الشيفرة إلى كل معالج إلى التكرار وزيادة احتمالية الأخطاء.

تتيح لك سلوكيات مسار المعالجة في MediatR إحاطة كل طلب بمنطق مشترك.

// One behavior runs around all handlers

IPipelineBehavior

يطبّق السلوك IPipelineBehavior<TRequest, TResponse>. وتتلقى دالة Handle الخاصة به الطلب ومفوّضًا باسم next يستدعي بقية مسار المعالجة.

public class LoggingBehavior<TRequest, TResponse>
    : IPipelineBehavior<TRequest, TResponse>
    where TRequest : notnull
{
    public async Task<TResponse> Handle(
        TRequest request,
        RequestHandlerDelegate<TResponse> next,
        CancellationToken ct)
    {
        // before
        var response = await next();
        // after
        return response;
    }
}

المفوّض next

يستدعي next() السلوك التالي، أو المعالج الفعلي إذا كان هذا آخر سلوك. وتُنفّذ الشيفرة قبل الاستدعاء أثناء الدخول، بينما تُنفّذ الشيفرة بعده أثناء الخروج.

// [Behavior A in] -> [Behavior B in] -> [Handler]
//               <- [Behavior B out] <- [A out]

سلوك التسجيل

يسجّل سلوك تسجيل ملموس اسم الطلب أثناء الدخول والوقت المنقضي أثناء الخروج.

public async Task<TResponse> Handle(
    TRequest request,
    RequestHandlerDelegate<TResponse> next,
    CancellationToken ct)
{
    var name = typeof(TRequest).Name;
    _logger.LogInformation("Handling {Name}", name);
    var sw = Stopwatch.StartNew();
    var response = await next();
    _logger.LogInformation("{Name} took {Ms}ms", name, sw.ElapsedMilliseconds);
    return response;
}

تسجيل سلوك

سجّل السلوك العام المفتوح في DI. وسيطبّقه MediatR على كل طلب.

builder.Services.AddTransient(
    typeof(IPipelineBehavior<,>),
    typeof(LoggingBehavior<,>));

سلوك التحقق

من الاستخدامات الشائعة التحقق من الطلبات باستخدام FluentValidation. وينفّذ السلوك جميع عمليات التحقق قبل تشغيل المعالج، ويطرح استثناءً إذا فشل أي منها.

public async Task<TResponse> Handle(
    TRequest request,
    RequestHandlerDelegate<TResponse> next,
    CancellationToken ct)
{
    var context = new ValidationContext<TRequest>(request);
    var failures = _validators
        .Select(v => v.Validate(context))
        .SelectMany(r => r.Errors)
        .Where(f => f is not null)
        .ToList();
    if (failures.Count != 0)
        throw new ValidationException(failures);
    return await next();
}

الإيقاف المبكر

يمكن للسلوك تخطي المعالج بالكامل عبر الإرجاع دون استدعاء next()، وهو أمر مفيد لتخزين نتائج الاستعلامات مؤقتًا أو رفض الطلبات غير الصالحة.

if (_cache.TryGet(key, out TResponse cached))
    return cached;          // handler never runs
var response = await next();
_cache.Set(key, response);
return response;

ترتيب السلوكيات

تُنفّذ السلوكيات بالترتيب الذي سُجّلت به. ضع التسجيل في الغلاف الخارجي، يليه التحقق، ثم المعاملات، بحيث يحيط كل سلوك بالسلوك التالي على النحو الصحيح.

services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(TransactionBehavior<,>));

سلوك المعاملات

أحط معالجات الأوامر بمعاملة لقاعدة البيانات حتى تُثبّت العملية بأكملها أو تُرجع ذريًا.

await using var tx = await _db.Database.BeginTransactionAsync(ct);
try
{
    var response = await next();
    await tx.CommitAsync(ct);
    return response;
}
catch
{
    await tx.RollbackAsync(ct);
    throw;
}

استهداف طلبات محددة

استخدم واجهة تعليمية وقيدًا عامًا بحيث لا ينطبق السلوك إلا على الطلبات التي تختار تفعيله، مثل تطبيق المعاملات على الأوامر فقط.

public interface ITransactional { }
public record CreateOrderCommand(...) : IRequest<int>, ITransactional;

// where TRequest : ITransactional

لماذا تتفوق السلوكيات على البرمجيات الوسيطة

على خلاف البرمجيات الوسيطة لـ HTTP، تعمل السلوكيات لكل رسالة، وتتعامل مع الطلب والاستجابة ذوي النوع المحدد، كما تعمل حتى عند توزيع الطلب خارج HTTP (مثلًا من مهمة في الخلفية).

// Strongly typed, transport-independent cross-cutting logic

تحقق سريع

تأكّد من كيفية عمل السلوكيات.

مراجعة

لقد تعلّمت سلوكيات مسار المعالجة:

  • يحيط IPipelineBehavior<TRequest, TResponse> بكل طلب بمنطق مشترك.
  • يدفع المفوّض next مسار المعالجة إلى الأمام، ويؤدي تخطيه إلى إيقاف المعالج مبكرًا.
  • تشمل الاستخدامات الشائعة التسجيل والتحقق والمعاملات والتخزين المؤقت.
  • تُنفّذ السلوكيات بترتيب التسجيل، وتكون ذات أنواع محددة بقوة.

التالي: الإشعارات والأحداث.

البدء مجانًا

تعلم C# مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
93
الدروس
346

الأسئلة الشائعة

هل درس «سلوكيات مسار المعالجة» مجاني؟

نعم — نص درس «سلوكيات مسار المعالجة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «سلوكيات مسار المعالجة»؟

أضيفوا منطقًا مشتركًا باستخدام السلوكيات تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «سلوكيات مسار المعالجة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مفاهيم CQRS
  2. الأوامر والمعالجات باستخدام MediatR
  3. سلوكيات مسار المعالجة
  4. الإشعارات والأحداث
← العودة إلى C# Academy