در این مقاله قصد دارم در مورد بهینهسازی Program.cs صحبت کنم، همونطور که میدانید از نسخه Net 6. به بعد فایل های Program.cs و Startup.cs به نوعی با هم ترکیب شدند و یک فایل واحد به نام Program.cs ماندگار شد.
در این مقاله می خواهم در مورد بهینهسازی این فایل صحبت کنم و اینکه چطور میتوان تا جایی که میتوانیم کدها ی مروبط به Pipeline، سرویس ها و … را در این فایل بهینه کنیم.
در نظر بگیرید، که این بهینه سازی تنها در مورد clean Code صدق میکند و در خصوص Performance شما تاثیری نخواهد داشت.
بهصورت خلاصه یک درخواست web در ASP.NET Core به شکل زیر هست.
زمانی که یک درخواست ارسال می شود، Kestrel شروع به ساخت HTTP Context می کند، و آن را به فرایند پردازش ارسال میکند که به آن Pipeline گفته میشود.
هر قطعه در ASP.NET Core Application را Middleware میگوییم، Pipeline بهصورت قطعه به قطعه فرایندها را انجام میدهد و به Pipeline بعدی ارسال میکند، در انتها Pipeline نهایی قرار دارد که به آن Endpoint گفته میشود.
پس از انجام تمامی پردازش ها، Middleware ها نتیجه پردازش را به قطعه قبل از خود ارسال میکنند و در نهایت Middleware ابتدایی آن را به Kestrel باز میگرداند.
حال به بررسی Program.cs بپردازیم:
بعد از ایجاد یک API، فایل Program.cs شما چیزی شبیه به قطعه کد زیر خواهد بود، این کلاس یک نمونه از Webapplication را با استفاده از الگوی Builder ایجاد میکند.
سپس سرویس ها و pipeline ها را در آن ثبت میکند، یکی از مشکلاتی که ممکن است با بزرگ شدن پروژه با آن دست و پنجه نرم کنید این است که کلاس program.cs شما با گسترش پروژه ممکن است به یک God class
تبدیل شود و درک و فهم آن باعث مشکل شود، برای حل این موضوع میتوان این کلاس را به دو قسمت services و pipeline تقسیم بندی کرد.
بدین شکل که یک کلاس static به نام Installers ایجاد کنیم و این دو متد را در آن پیادهسازی کنیم.
public static class Installers { public static WebApplication ConfigureServices(this WebApplicationBuilder builder) { builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); return builder.Build(); } public static WebApplication ConfigurePipelines(this WebApplication app) { // Configure the HTTP request pipeline. app.UseSwagger(); app.UseSwaggerUI(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); return app; } }
و در نهایت program.cs به شکل زیر خواهد بود:
var builder = WebApplication.CreateBuilder(args); var app = builder .ConfigureServices() .ConfigurePipelines(); app.Run();
همانطور که مشاهده میکنید، توانستیم کلاس Program را تا حد ممکن ساده، خوانا و بهینه کنیم و انجام هر فرایند را به متد مورد نظر ارسال کنیم، بدین صورت که قانون SRP را نیز رعایت کردیم.