تغییر خوشایند در کلاس Program در .NET 10: دیگر نیازی به public partial نیست!
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۸/۲۹ ۱۳:۲۹
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
WebApplicationFactory استفاده میکنید، حتماً این تغییر کوچک، اما مفید در .NET 10 شما را خوشحال خواهد کرد. در ادامه بهطور کامل به بررسی این تغییر میپردازیم و میبینیم چرا دیگر لازم نیست آن خط کد اضافی را نگه داریم.Program.cs در پروژههای ASP.NET Core بسیار سادهتر و تمیزتر شد. دیگر نیازی به نوشتن کلاس Program کامل و متد Main نبود؛ کامپایلر خودش یک کلاس Program تولیدشده (generated) میساخت و کد شما را داخل آن قرار میداد. اما این سادگی یک مشکل کوچک برای تستنویسان ایجاد کرد: کلاس Program تولیدشده به صورت پیشفرض internal بود و WebApplicationFactory نیاز به یک نوع public داشت تا بتواند اپلیکیشن را بوت کند. در نتیجه، مجبور بودیم یک ترفند کوچک به کار ببریم.public class MyIntegrationTests : IClassFixture<WebApplicationFactory<Program>>
{
private readonly WebApplicationFactory<Program> _factory;
public MyIntegrationTests(WebApplicationFactory<Program> factory)
{
_factory = factory;
}
// تستهای شما...
}Program تولیدشده internal بود و پروژه تست (که معمولاً در assembly جداگانه است) نمیتوانست به آن دسترسی پیدا کند. خطای کامپایل میگرفتید:Program.cs:var builder = WebApplication.CreateBuilder(args);
// ... تنظیمات اپلیکیشن شما ...
var app = builder.Build();
// ... تنظیمات pipeline ...
app.Run();
// این خط جادویی!
public partial class Program { }InternalsVisibleTo هم وجود داشت، اما این روش تمیزتر و پراستفادهتر بود.)Program تولیدشده در پروژههای ASP.NET Core به صورت پیشفرض public است. یعنی دیگر نیازی به اضافه کردن آن خط public partial class Program { } نیست!WebApplicationFactory استفاده کنید، بدون هیچ تنظیم اضافی. کد Program.cs شما دوباره کاملاً تمیز و مینیمال میماند.ASP0027: Unnecessary public Program class declaration
استفاده از public partial class Program { } برای عمومی کردن کلاس Program تولیدشده دیگر لازم نیست.نکته مهم: این تغییر فقط برای پروژههای ASP.NET Core اعمال میشود، چون مشکل اصلی در استفاده ازWebApplicationFactoryبود. در پروژههای کنسولی معمولی، کلاسProgramتولیدشده همچنان internal میماند (مگر اینکه خودتان partial public اضافه کنید).