MediatR به دلیل تکیه بر بازتاب در زمان اجرا (runtime reflection)، از مشکلات دیباگ، زمان طولانی استارتآپ و گلوگاههای عملکرد رنج میبرد. SwitchMediator با استفاده از C# Source Generators قصد دارد این مشکلات را حل کند.
مشکلات MediatR (بازتاب در زمان اجرا)
- پیچیدگی دیباگ: به دلیل کد داخلی پیچیده کتابخانه و استفاده از بازتاب، قدم گذاشتن در منطق mediator دشوار است.
- هزینه عملکرد در زمان اجرا: بازتاب و جستجوهای دیکشنری (که اغلب از طریق بازتاب پر میشوند) به هر درخواست تأخیر اضافه میکنند.
- تأخیر در استارتآپ: اسکن اسمبلیها و ساخت نگاشتهای داخلی در هنگام شروع برنامه زمان میبرد.
- چالشهای Trimming/AOT: بازتاب میتواند سازگاری کد با .NET trimming و کامپایل Ahead-of-Time (AOT) را کاهش دهد.
- خطاهای Handler Not Found در زمان اجرا: یافتن هندلرهای از دست رفته فقط در زمان اجرا امکانپذیر است.
راه حل SwitchMediator (تولید کد منبع در زمان کامپایل)
- از C# Source Generators برای تجزیه و تحلیل کد در زمان ساخت استفاده میکند.
- یک پیادهسازی mediator مشخص و متناسب با هندلرها و پایپلاینهای برنامه تولید میکند.
- کد C# بهینه شده با جستجوهای دیکشنری استاتیک برای ارسال درخواست ایجاد میکند.
- هزینه عملکرد را به زمان کامپایل منتقل میکند و در نتیجه زمان اجرای سریعتری به دست میآید.
مزایای کلیدی SwitchMediator
- قابلیت دیباگ پیشرفته: توسعهدهندگان میتوانند مستقیماً وارد کد #C تولید شده (
SwitchMediator.g.cs) شوند و منطق دقیق ارسال و اجرای پایپلاین را مشاهده کنند. - حداکثر عملکرد: حذف بازتاب در زمان اجرا برای ارسال، منجر به سرعت بیشتر در مدیریت درخواستها و اعلانها میشود.
- ایمنی در زمان کامپایل: هندلرهای از دست رفته منجر به خطاهای ساخت میشوند و از بروز خطاهای زمان اجرا جلوگیری میکنند.
- سازگاری با Trimming / AOT: اجتناب از بازتاب در زمان اجرا، سازگاری مکانیزم اصلی با .NET trimming و AOT را بهبود میبخشد.
- صراحت: کد تولید شده به عنوان مستندات واضح و قابل بازرسی در مورد نحوه مسیریابی درخواستها و ساخت پایپلاینها برای هر نوع پیام عمل میکند.
بنچمارکهای عملکرد
SwitchMediator در مقایسه با MediatR، دستاوردهای عملکرد قابل توجهی را نشان میدهد:
- استارتآپ: تا 146 برابر سریعتر با 600 هندلر.
- ارسال درخواست (Send): تقریباً 3 برابر سریعتر و تولید 3 برابر کمتر زباله.
- انتشار اعلان (Publish): حدود 6.7 برابر سریعتر با صفر تخصیص حافظه.
- اجرای پایپلاین: به طور مداوم سریعتر و با تخصیص حافظه کمتر.
مشاهده مطلب اصلی