TGViewer
C# Geeks (.NET) C# Geeks (.NET) @csharpgeeks · 548 subscribers
Post #165 142
دکوراتور اعتبارسنجی با FluentValidation: ✅


internal sealed class ValidationCommandHandler<TCommand, TResponse>(...)
: ICommandHandler<TCommand, TResponse>
where TCommand : ICommand<TResponse>
{
public async Task<Result<TResponse>> Handle(TCommand command, CancellationToken cancellationToken)
{
// ... (منطق اعتبارسنجی قبل از اجرای handler اصلی) ...
}
}


⚠️ مهم: از آنجایی که ما با اینترفیس‌های جنریک کار می‌کنیم، هر دکوراتور باید صراحتاً همان قرارداد جنریک را هدف قرار دهد.

در بخش بعدی، این را با استفاده از Scrutor به هم متصل خواهیم کرد.

راه‌اندازی DI ⚙️

با handlerها و دکوراتورهایمان، می‌توانیم همه چیز را با استفاده از Scrutor ثبت کنیم.
services.Scan(scan => scan.FromAssembliesOf(typeof(DependencyInjection))
.AddClasses(classes => classes.AssignableTo(typeof(IQueryHandler<,>)), publicOnly: false)
.AsImplementedInterfaces()
.WithScopedLifetime()
// ... ثبت بقیه handlerها ...
);

🔹این کد اسمبلی اپلیکیشن را اسکن کرده و تمام command و query handlerها را ثبت می‌کند.

🔹سپس، دکوراتورها را برای اعتبارسنجی و لاگینگ اعمال می‌کنیم:
services.Decorate(typeof(ICommandHandler<,>), typeof(ValidationDecorator.CommandHandler<,>));
services.Decorate(typeof(ICommandHandler<,>), typeof(LoggingDecorator.CommandHandler<,>));

💡ترتیب مهم است. آخرین دکوراتور اعمال شده، بیرونی‌ترین دکوراتور در زمان اجرا خواهد بود. بنابراین در این مثال، دکوراتور لاگینگ ابتدا اجرا می‌شود، سپس اعتبارسنجی و بعد handler اصلی.

استفاده از Minimal API 🎯

هنگامی که همه چیز متصل شد، استفاده از یک command handler از یک endpoint Minimal API ساده است:
app.MapPut("todos/{id:guid}/complete", async (
Guid id,
ICommandHandler<CompleteTodoCommand> handler,
CancellationToken cancellationToken) =>
{
var command = new CompleteTodoCommand(id);
Result result = await handler.Handle(command, cancellationToken);
return result.Match(Results.NoContent, CustomResults.Problem);
})


ما ICommandHandler مناسب را مستقیماً به endpoint تزریق می‌کنیم. نیازی به ISender، لایه mediator یا جستجوی زمان اجرا نیست.

نتیجه‌گیری 👍

CQRS
به یک فریم‌ورک پیچیده نیاز ندارد.
با چند اینترفیس کوچک، چند کلاس دکوراتور و یک راه‌اندازی تمیز DI، می‌توانید یک پایپ‌لاین ساده و انعطاف‌پذیر برای مدیریت کامندها و کوئری‌ها بسازید. درک، تست و توسعه آن آسان است.

امیدوارم این مطلب مفید بوده باشد.

🔖 هشتگ‌ها:
#CSharp #DotNet #CQRS #SoftwareArchitecture #CleanArchitecture #DesignPatterns #BestPractices #MediatR
More from @csharpgeeks
  1. Sep 22, 2026یه مدتی قراره از دنیای NET. فاصله بگیرم، چون وقتشه برم سربازی. راستش نمیدونم این مدت رو چج…
  2. Sep 20, 2026🔥 حالا مشکل اصلی: Alert Storm فرض کن Database از دسترس خارج شده. ۱۰۰ Pod داری. هر Pod می‌…
  3. Sep 20, 2026🚨 طراحی سیستم Monitoring و Alerting در یک سیستم بزرگ فرض کن ساعت ۳ صبح است. سیستم شما با…
  4. Sep 19, 2026#Engineering_Leadership تصمیم نگرفتن هم یک تصمیم است یه چیز عجیب توی تیم‌های مهندسی: گاهی…
  5. Sep 19, 2026☑ چک‌لیست آماده‌سازی تیم، فرایندها و زیرساخت برای توسعه با AI توجه: هیچ چک‌لیستی جهان‌شمول…
  6. Sep 19, 2026📌پایان یک انتظار طولانی: اعتبارسنجی ناهمگام (Async Validation) در NET 11.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →