در نسخه 4.14 کامپایلر Roslyn (که بخشی از .NET 10 SDK است)، یک API جدید برای تولیدکنندههای منبع معرفی شده است. این API یک راه حل ساده برای مشکلی که با ویژگیهای نشانگر (marker attributes) مرتبط است، ارائه میدهد. این ویژگیها اغلب برای هدایت رفتارهای تولیدکنندههای منبع استفاده میشوند.
این پست به بررسی مشکل و مرور راه حل موجود که در SDKهای قبلی در دسترس بود، میپردازد. سپس API جدید را معرفی کرده و نحوه استفاده از آن را نشان میدهد. در نهایت، مزایا و معایب API جدید را در مقایسه با راه حل موجود بررسی کرده و توضیح میدهد که چه زمانی باید از هر کدام استفاده کرد. این پست با استفاده از ویژگیهای موجود در .NET 10 preview 5 نوشته شده است و ممکن است تغییراتی قبل از انتشار نهایی .NET 10 رخ دهد.
تولیدکنندههای منبع افزایشی (Incremental Source Generators) سالهاست که وجود دارند و runtime شامل تولیدکنندههای داخلی متعددی است. به همین دلیل، انتظار میرود اکثر توسعهدهندگان با تولیدکنندههای منبع آشنا باشند، حتی اگر با نحوه ساخت آنها آشنا نباشند. یکی از محرکهای رایج برای بسیاری از تولیدکنندههای منبع، افزودن یک ویژگی (attribute) از نوعی است. به عنوان مثال، تولیدکننده LoggerMessage که بخشی از کتابخانه Microsoft.Extensions.Logging در .NET 6 است، از ویژگی [LoggerMessage] برای تعریف کدی که باید تولید شود، استفاده میکند.
یک الگوی رایج در مثالها (هم از Microsoft و هم از جامعه) استفاده از API تولیدکننده منبع به نام RegisterPostInitializationOutput() است. این hook به طور خاص برای افزودن ویژگیهای نشانگر به کامپایل کاربر طراحی شده است، که سپس میتوان از آنها در تولیدکننده استفاده کرد. در واقع، این سناریو به عنوان "راه" برای کار با ویژگیهای نشانگر در کتاب راهنمای تولیدکننده منبع ذکر شده است.
این API جدید به توسعهدهندگان اجازه میدهد تا به راحتی ویژگیهای نشانگر را به کامپایل اضافه کنند و از آنها برای هدایت رفتارهای تولیدکننده منبع استفاده کنند، در حالی که از پیچیدگیهای روشهای قبلی جلوگیری میکنند. این امر به ویژه برای کتابخانههایی که نیاز به تولید کد سفارشی بر اساس ویژگیهای تعریف شده توسط کاربر دارند، مفید است.
مشاهده مطلب اصلی