CodeShot

IRequest در مقابل INotification

IRequest در MediatR یک پیام است که دقیقاً یک Handler مشخص آن را پردازش می‌کند و می‌تواند یک نتیجه هم برگرداند (مثل Command یا Query)، در حالی که INotification یک رویداد است که می‌تواند توسط صفر یا چند Handler مستقل و بدون بازگشت مقدار مشخص، هم‌زمان پردازش شود.

ویژگیIRequestINotification
تعداد Handlerدقیقاً یکصفر یا چند
مقدار بازگشتیمی‌تواند داشته باشدندارد
کاربرد رایجCommand/Queryرویداد (Event)

کِی از IRequest استفاده کنیم؟

وقتی دقیقاً یک عملیات مشخص با یک نتیجه واحد را می‌خواهید اجرا کنید، مثل «ایجاد سفارش» که باید یک شناسه برگرداند.

کِی از INotification استفاده کنیم؟

وقتی می‌خواهید وقوع یک رویداد را به چند بخش مختلف و مستقل از هم اطلاع دهید، مثل «سفارش ایجاد شد» که هم باید ایمیل بفرستد و هم لاگ ثبت کند.

مثال IRequest

public record CreateOrder(int UserId) : IRequest<Guid>;

public class Handler : IRequestHandler<CreateOrder, Guid>
{
    public Task<Guid> Handle(CreateOrder r, CancellationToken ct)
        => ...; // دقیقاً یک Handler
}

مثال INotification

public record OrderCreated(Guid OrderId) : INotification;

public class EmailHandler : INotificationHandler<OrderCreated> { ... }
public class LogHandler : INotificationHandler<OrderCreated> { ... }
// هر دو Handler مستقل اجرا می‌شوند

اشتباه رایج

اشتباه رایج تعریف چند Handler برای یک IRequest است که باعث خطای Runtime می‌شود؛ MediatR فرض می‌کند هر IRequest دقیقاً یک Handler دارد، برای سناریوهای چند-Handler باید حتماً از INotification استفاده شود.

جمع‌بندی

برای عملیاتی با دقیقاً یک نتیجه و یک Handler از IRequest و برای اطلاع‌رسانی رویداد به چند شنونده مستقل از INotification استفاده کنید.