یک نکته‌ی تکمیلی:  امکان مشاهده‌ی کدهای تولیدی توسط Source Generators، به آخرین نگارش Rider هم ذیل قسمت مشاهده‌ی Dependencies، اضافه شده‌است:

- خیر. به همین صورت است و این مشکلی نیست. تمام الگوریتم‌های هش به همین صورت هستند. اصلا امضای دیجیتال به همین معنا است. قرار نیست امضای دیجیتال یک محتوا از یک سیستم به سیستم دیگر متفاوت باشد. الگوریتم یاد شده هم به همراه salt هست که در مطلب لینک داده شده نحوه‌ی ذخیره سازی آن ذکر شده.
+ کسی که دسترسی کپی کردن اطلاعاتی را از یک بانک اطلاعاتی، به بانک اطلاعاتی دوم دارد، نیازی به دانستن یا دستکاری هش کلمات عبور را ندارد؛ چون از این مراحل رد شده و دسترسی کاملی را به تمام اجزای بانک اطلاعاتی که برنامه‌ی شما فقط یک پوسته‌ی دسترسی به آن است، دارد.
+ امکان تعویض الگوریتم هش کردن اطلاعات، با پیاده سازی سفارشی IPasswordHasher وجود دارد. اما چون پیاده سازی پیش‌فرض خود ASP.NET Core Identity بسیار عالی است، عموما چنین کاری انجام نمی‌شود.
‫۲ سال و ۱ ماه قبل، شنبه ۸ مرداد ۱۴۰۱، ساعت ۱۴:۵۰
بله. به همین صورت است؛ همان اولین تصویر این مطلب. این رفتار عادی و همیشه به همین صورت است؛ چه با این progress-bar و چه بدون آن (همان حالت پیش فرض بدون autostart=false). فقط الان عملیات صورت گرفته با دقت بیشتری نمایش داده میشود و کاملا مشخص است که اگر فایلها نیازی به دریافت مجدد ندارند (چون کش شدند)، فقط بارگذاری یک فایل js اصلی باقیمانده صورت گرفته.
‫۲ سال و ۱ ماه قبل، یکشنبه ۲ مرداد ۱۴۰۱، ساعت ۱۷:۱۴
اما هنگام پابلیش ، تو پوشه _framework هنوز حدود 200  dll قرار میگیره و دانلود اینها تو مرورگر لود را میبره بالا . 
به ازای هر فایل نگارش اصلی dll، نگارش gz. و یا br. آن هم جداگانه تولید و نگهداری می‌شود که به ظاهر تعداد آن‌ها زیاد است. از هر کدام از این‌ها فقط «یکی» بر اساس تنظیمات سرور و نحوه‌ی درخواست مرورگر ارائه خواهد شد و نه تمام آن‌ها. همچنین در طی publishهای بعدی، بر اساس امضای دیجیتال فایل‌های دریافتی و کش شده‌ی در مرورگر، موارد تکراری دریافت نخواهند شد.
- چون date picker ای که در حال استفاده هستید، سورس باز واقعی نیست و فشرده شده، نتوانستید کدهای آن‌را مطالعه کنید. قطعه کد PersianDatePicker.Show مربوط به مطلب جاری هست و ارتباطی به سایر تقویم‌ها ندارد و اصلا معادلی در date picker‌های دیگر ندارد.
- برای سایر تقویم‌ها onclick را حذف کنید. اگر خودش onchange دارد، از آن همان استفاده کنید و نیاز به تغییر دیگری ندارد (نیازی به addEventListener ندارد). یعنی کدهای window.CallAmib همان  enableDatePicker می‌شوند (البته فقط قسمت objectReference.invokeMethodAsync آن نیاز است). بنابراین بسته به اینکه کدام را می‌خواهید صدا بزنید، سطر فعالسازی آن باید تنظیم شود.
‫۲ سال و ۱ ماه قبل، جمعه ۳۱ تیر ۱۴۰۱، ساعت ۱۹:۳۶
یک نکته‌ی تکمیلی: روش دیگری برای یافتن کلاس‌ها

در مثال فوق، در متد Execute کار یافتن کلاس‌ها انجام شد. برای مثال روش یافتن کنترلرهای یک برنامه‌ی MVC در اینجا به صورت زیر است:
var controllers =
context.Compilation
    .SyntaxTrees
    .SelectMany(syntaxTree => syntaxTree.GetRoot().DescendantNodes())
    .Where(x => x is ClassDeclarationSyntax)
    .Cast<ClassDeclarationSyntax>()
    .Where(c => c.Identifier.ValueText.EndsWith("Controller", StringComparison.OrdinalIgnoreCase))
    .ToImmutableList();
 روش دیگری هم برای اینکار وجود دارد که در مثال‌های مایکروسافت زیاد استفاده می‌شود و آن هم استفاده از اینترفیس ISyntaxReceiver است که سبب می‌شود تا کدهای متد Execute اندکی خلوت‌تر شوند:
public class ControllerFinder : ISyntaxReceiver
{
    public List<ClassDeclarationSyntax> Controllers { get; }
        = new();
    
    public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
    {
        if (syntaxNode is ClassDeclarationSyntax controller)
        {
            if (controller.Identifier.ValueText.EndsWith("Controller"))
            {
                Controllers.Add(controller);
            }
        }
    }
}
برای معرفی این ISyntaxReceiver اینبار از متد Initialize به نحو زیر کمک گرفته می‌شود:
public void Initialize(GeneratorInitializationContext context)
{
    context.RegisterForSyntaxNotifications(() => new ControllerFinder());
}
اکنون بازنویسی متد Execute برای استفاده‌ی از این SyntaxReceiver به صورت زیر است:
public void Execute(GeneratorExecutionContext context)
{
    var controllers = 
        ((ControllerFinder) context.SyntaxReceiver)?.Controllers;
    
    // use controllers to do work...
}

عموما این نوع کوئری گرفتن‌ها اندکی مشکل است. پروژه‌ی SourceGeneratorsKit مثال‌های بیشتری را در این زمینه در جهت یافتن ساده‌تر متدهایی که ویژگی‌های خاصی را دارند، کلاس‌هایی که اینترفیس خاصی را پیاده سازی می‌کنند و امثال آن، ارائه می‌دهد.
یک نکته‌ی تکمیلی: روش دیباگ پروژه‌های Source Generator در Visual Studio

برای اینکار اولین تغییر مورد نیاز، افزودن تنظیم زیر به فایل csproj پروژه‌ی Source Generator است:
<PropertyGroup>
   <TargetFramework>netstandard2.0</TargetFramework>
   <IsRoslynComponent>true</IsRoslynComponent>
سپس در Solution explorer به خواص پروژه‌ی source generator مراجعه کرده و در برگه‌ی Debug آن، دراپ‌داون Launch را انتخاب و گزینه‌ی IsRoslynComponent تنظیمی را انتخاب کنید.
در ادامه در هر قسمتی از کدهای Source generator که نیاز به دیباگ هست، برای مثال ابتدای متد Execute، باید چندسطر زیر را اضافه کرد:
#if DEBUG
if (!Debugger.IsAttached)
{
   Debugger.Launch();
}
#endif
این کدها فقط در حالت دیباگ اضافه شده و با کامپایل برنامه و یا فشردن دکمه‌ی F5، سبب نمایش پنجره‌ی جدید choose just-in-time debugger می‌شوند. در اینجا می‌توانید یک وهله‌ی جدید از ویژوال استودیو را برای دیباگ انتخاب کنید و یا می‌توان همان وهله‌ی جاری را نیز انتخاب کرد تا سبب اجرای مجدد ویژوال استودیو نشود. در این حالت debugger به پروژه متصل شده و امکان دیباگ آن میسر می‌شود. ابتدا ویژوال استودیو بر روی سطر Debugger.Launch، متوقف می‌شود. سپس break-pointهای مدنظر خود را قرار داده و با فشردن دکمه‌ی F5 می‌توان به آن‌ها رسید و آن‌ها را دیباگ کرد.