مقدمه

به فصل پایانی این دوره خوش آمدید! تا به اینجا، ما یک سفر طولانی را در دنیای C# و .NET طی کرده‌ایم، از مبانی زبان گرفته تا مفاهیم پیشرفته‌ای مانند برنامه‌نویسی موازی، انعکاس و ساخت وب‌سرویس. در تمام سناریوهای وب، یک فرض مشترک وجود داشت: منطق سمت سرور با C# نوشته می‌شود، اما منطق تعاملی سمت کلاینت (در مرورگر) نیازمند استفاده از JavaScript است. اما چه می‌شد اگر می‌توانستیم از همان زبان قدرتمند C# و اکوسیستم غنی .NET برای ساخت رابط‌های کاربری وب نیز استفاده کنیم؟

این دقیقاً همان رویایی است که Blazor آن را به واقعیت تبدیل کرده است. Blazor یک فریم‌ورک مدرن و انقلابی از مایکروسافت است که به توسعه‌دهندگان اجازه می‌دهد تا اپلیکیشن‌های وب تعاملی و تک‌صفحه‌ای (Single-Page Applications - SPAs) را با استفاده از C# و HTML بسازند، به جای اینکه مجبور به استفاده از JavaScript باشند. این به معنای اشتراک‌گذاری کد و منطق بین سمت سرور و کلاینت، استفاده از هزاران کتابخانه‌ی NuGet موجود، و بهره‌مندی از تمام قدرت زبان C# برای ساخت رابط‌های کاربری است.

چگونه Blazor کار می‌کند؟ مدل‌های میزبانی

"جادوی" Blazor در مدل‌های میزبانی (Hosting Models) انعطاف‌پذیر آن نهفته است. Blazor منطق رندر کردن رابط کاربری را از نحوه‌ی اعمال به‌روزرسانی‌ها در DOM مرورگر جدا می‌کند. دو مدل میزبانی اصلی برای Blazor وجود دارد:

۱. Blazor Server

در این مدل، اپلیکیشن شما بر روی سرور اجرا می‌شود.

  • وقتی کاربر به سایت مراجعه می‌کند، یک اتصال آنی و دوطرفه بین مرورگر و سرور با استفاده از تکنولوژی SignalR برقرار می‌شود.
  • تمام منطق C# و پردازش رویدادها (مانند کلیک کردن یک دکمه) بر روی سرور اتفاق می‌افتد.
  • Blazor تغییرات لازم در HTML را محاسبه کرده و تنها آن "دلتا" یا تفاوت را از طریق اتصال SignalR به مرورگر ارسال می‌کند.
  • مرورگر این تغییرات کوچک را دریافت و DOM را به‌روزرسانی می‌کند.

مزایا: حجم دانلود اولیه بسیار کم است (چون هیچ .NET Runtime یا کدی به کلاینت ارسال نمی‌شود)، و برنامه به تمام قابلیت‌های سمت سرور دسترسی کامل دارد.
معایب: به یک اتصال دائمی به سرور نیاز دارد و هر تعامل کاربر نیازمند یک سفر رفت و برگشت به سرور است که می‌تواند منجر به تأخیر (latency) شود.

۲. Blazor WebAssembly

در این مدل، اپلیکیشن شما مستقیماً در مرورگر کاربر اجرا می‌شود.

  • هنگام اولین بازدید، یک نسخه‌ی کامل از .NET Runtime که به فرمت WebAssembly (Wasm) کامپایل شده، به همراه تمام DLLهای برنامه‌ی شما، به مرورگر دانلود می‌شود.
  • WebAssembly یک استاندارد باز و یک فرمت باینری سطح پایین است که به کد نوشته شده در زبان‌هایی مانند C، C++ و C# اجازه می‌دهد تا با سرعتی نزدیک به کد بومی، در مرورگرهای وب مدرن اجرا شود.
  • پس از دانلود اولیه، تمام پردازش‌ها، منطق و رندر کردن UI به طور کامل در مرورگر و بدون نیاز به اتصال به سرور انجام می‌شود.

مزایا: اپلیکیشن می‌تواند به صورت کاملاً آفلاین کار کند و پس از بارگذاری اولیه، بسیار سریع و پاسخگو است.
معایب: حجم دانلود اولیه بسیار بزرگ‌تر است و ممکن است بارگذاری اولیه کمی طول بکشد. همچنین، اجرای کد در مرورگر با محدودیت‌های امنیتی جعبه شنی (sandbox) مواجه است.

کامپوننت‌ها: بلوک‌های سازنده‌ی UI در Blazor

صرف‌نظر از مدل میزبانی، رابط کاربری در Blazor با استفاده از کامپوننت‌های (Components) قابل استفاده مجدد ساخته می‌شود. یک کامپوننت، یک قطعه‌ی خودکفا از UI است که شامل نشانه‌گذاری HTML و منطق پردازشی C# می‌باشد. این کامپوننت‌ها در فایل‌هایی با پسوند .razor نوشته می‌شوند.

یک کامپوننت ساده می‌تواند به شکل زیر باشد:

Copy Icon Counter.razor
<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}

این کامپوننت یک شمارنده‌ی ساده را پیاده‌سازی می‌کند. بخش @code حاوی منطق C# است. ما یک فیلد خصوصی currentCount برای نگهداری وضعیت داریم. با استفاده از @onclick رویداد کلیک دکمه را به متد IncrementCount خود متصل کرده‌ایم. هر زمان که کاربر روی دکمه کلیک می‌کند، این متد اجرا شده، مقدار currentCount افزایش یافته و Blazor به طور خودکار بخش را برای نمایش مقدار جدید، به‌روزرسانی می‌کند. این مدل برنامه‌نویسی کامپوننت‌محور، ساخت رابط‌های کاربری پیچیده را بسیار ساده و مدیریت‌پذیر می‌کند.