ارتقاء به ASP.NET Core 3.0: محدود شدن امکان تزریق وابستگیها در سازندهی کلاس آغازین برنامه
یکی از تغییرات مهم ASP.NET Core 3.0 نسبت به نگارشهای قبلی، جنریک شدن Host آن است (چون حالتهای هاستینگ بیشتری را نسبت به حالت صرف MVC پشتیبانی میکند). به این ترتیب HostBuilder نگارش 2x:
اکنون در نگارش 3x به این صورت در آمدهاست:
این مورد، یک تغییر مهم را هم در وضعیت تزریق وابستگیهای سفارشی در کلاس آغازین برنامه ایجاد کردهاست: در نگارش 3x، فقط و فقط سرویسهای IHostEnvironment ،IWebHostEnvironment و IConfiguration را میتوانید به سازندهی کلاس آغازین آن تزریق کنید.
علت اینجا است که در ASP.NET Core 3x، یک باگ بسیار مهم سیستم تزریق وابستگیهای ASP.NET Core برطرف شدهاست: اکنون فقط یک dependency injection container به ازای کل برنامهی ASP.NET Core 3x ساخته میشود. در نگارشهای قبلی، یک container برای برنامه و یک container مجزا برای host تولید میشدند. در این حالت اگر یک سرویس Singleton را در فایل program.cs معرفی میکردید:
برخلاف تصور، این سرویس Singleton رفتار نمیکرد؛ چون همانطور که عنوان شد، دو container، برنامه را مدیریت میکردند (یعنی دوبار توسط دو ظرف متفاوت نگهدارندهی اشیاء، وهله سازی میشد) که اکنون در نگارش 3x به یک مورد کاهش یافتهاست.
در اینجا هرچند متد ConfigureServices وجود دارد، اما اگر از آن استفاده کنید، سرویس معرفی شدهی توسط آن، در سازندهی کلاس Startup شناسایی نمیشود.
یکی از تغییرات مهم ASP.NET Core 3.0 نسبت به نگارشهای قبلی، جنریک شدن Host آن است (چون حالتهای هاستینگ بیشتری را نسبت به حالت صرف MVC پشتیبانی میکند). به این ترتیب HostBuilder نگارش 2x:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>();
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
علت اینجا است که در ASP.NET Core 3x، یک باگ بسیار مهم سیستم تزریق وابستگیهای ASP.NET Core برطرف شدهاست: اکنون فقط یک dependency injection container به ازای کل برنامهی ASP.NET Core 3x ساخته میشود. در نگارشهای قبلی، یک container برای برنامه و یک container مجزا برای host تولید میشدند. در این حالت اگر یک سرویس Singleton را در فایل program.cs معرفی میکردید:
WebHost.CreateDefaultBuilder() .UseStartup<Startup>() .ConfigureServices(services => services.AddSingleton<MySingleton>()) .Build() .Run();
در اینجا هرچند متد ConfigureServices وجود دارد، اما اگر از آن استفاده کنید، سرویس معرفی شدهی توسط آن، در سازندهی کلاس Startup شناسایی نمیشود.