IRequest در مقابل INotification
IRequest در MediatR یک پیام است که دقیقاً یک Handler مشخص آن را پردازش میکند و میتواند یک نتیجه هم برگرداند (مثل Command یا Query)، در حالی که INotification یک رویداد است که میتواند توسط صفر یا چند Handler مستقل و بدون بازگشت مقدار مشخص، همزمان پردازش شود.
| ویژگی | IRequest | INotification |
|---|---|---|
| تعداد 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 استفاده کنید.
