روش های مختلف دفع اشیایی که IDisposable را در ASP.NET Core پیاده سازی می کنند را بیاموزید.
Dispose و Finalize دو روشی هستند که اغلب برای آزاد کردن منابع اشغال شده توسط برنامههای NET. و .NET Core شما در حال اجرا در زمینه CLR استفاده میکنید. مهمتر از همه، اگر منابع مدیریت نشده در برنامه خود دارید، باید منابع اشغال شده توسط چنین منابعی را به صراحت آزاد کنید.
با توجه به ماهیت غیر قطعی نهایی سازی و از آنجایی که نهایی کننده ها از نظر عملکرد پرهزینه هستند، روش Dispose بسیار بیشتر از نهایی کننده استفاده می شود. علاوه بر این، میتوانید از روش Dispose بر روی نوعی استفاده کنید که رابط IDisposable را پیادهسازی میکند.
این مقاله در مورد روشهای زیادی صحبت میکند که میتوانید اشیایی را که رابط IDisposable را در ASP.NET Core 6 پیادهسازی میکنند، از بین ببرید.
برای کار با نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخهای ندارید، میتوانید Visual Studio 2022 را از اینجا بارگیری کنید.
یک پروژه ASP.NET Core Web API در Visual Studio 2022 ایجاد کنید
ابتدا، اجازه دهید یک پروژه ASP.NET Core در Visual Studio 2022 ایجاد کنیم. با دنبال کردن این مراحل، یک پروژه ASP.NET Core Web API 6 جدید در Visual Studio 2022 ایجاد می کنیم:
- Visual Studio 2022 IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید”، “ASP.NET Core Web API” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- بعدی را کلیک کنید.
- در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
- به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب «قرار دادن راه حل و پروژه در یک فهرست راهنمای» را علامت بزنید.
- بعدی را کلیک کنید.
- در پنجره “اطلاعات اضافی” نشان داده شده در ادامه، .NET 6.0 (پیش نمایش) را به عنوان چارچوب هدف از لیست کشویی در بالا انتخاب کنید. “نوع احراز هویت” را به عنوان “هیچ” (پیش فرض) بگذارید. مطمئن شوید که گزینه «استفاده از کنترلرها …» علامت زده شده باشد.
- مطمئن شوید که چک باکسهای «Enable Docker»، «Configure for HTTPS» و «Enable Open API Support» علامت نخورده باشند زیرا ما در اینجا از هیچ یک از این ویژگیها استفاده نخواهیم کرد.
- روی ایجاد کلیک کنید.
این یک پروژه ASP.NET Core 6 Web API جدید در Visual Studio 2022 ایجاد میکند. ما از این پروژه برای کار با اشیایی که رابط IDisposable را در بخشهای بعدی این مقاله پیادهسازی میکنند، استفاده خواهیم کرد.
یک کلاس ایجاد کنید که رابط IDisposable را پیاده سازی کند
اکنون کلاسی ایجاد میکنیم که رابط IDisposable را همانطور که در قطعه کد زیر نشان داده شده است، پیادهسازی میکند.
public class FileManager: IDisposable {
FileStream fileStream = new FileStream(@"C:\Test.txt",
FileMode.Append);
public async Task Write(string text) {
byte[] buffer = Encoding.Unicode.GetBytes(text);
int offset = 0;
try {
await fileStream.WriteAsync(buffer, offset,
buffer.Length);
}
catch {
//Write code here to handle exceptions.
}
}
public void Dispose() {
if (fileStream != null) {
fileStream.Dispose();
}
}
}
کلاس FileManager رابط IDisposable را پیاده سازی می کند و شامل دو روش Write و Dispose می باشد. در حالی که اولی برای نوشتن متن روی یک فایل به صورت ناهمزمان استفاده می شود، دومی برای حذف نمونه FileStream از حافظه با فراخوانی متد Dispose از کلاس FileStream استفاده می شود.
دور انداختن اشیاء قابل مصرف ID در ASP.NET Core 6
در این بخش، روشهای مختلفی را بررسی میکنیم که از طریق آنها میتوانیم اشیاء قابل مصرف ID را در ASP.NET Core 6 از بین ببریم.
اشیاء قابل مصرف ID را با استفاده از عبارت “using” دور بریزید
ساده ترین راه برای از بین بردن یک نمونه IDisposable استفاده از عبارت “using” است که متد Dispose را به طور خودکار بر روی نمونه فراخوانی می کند. قطعه کد زیر این را نشان می دهد.
using(FileManager fileManager = new FileManager())
{
await fileManager.Write("This is a text");
}
اشیاء قابل مصرف ID را در انتهای درخواست دور بریزید
هنگامی که در برنامه های ASP.NET Core یا ASP.NET Core MVC کار می کنید، ممکن است اغلب لازم باشد اشیاء را در پایان درخواست HTTP دور بریزید. از روش HttpResponse.RegisterForDispose می توان برای ثبت اشیاء IDisposable برای دفع به این روش استفاده کرد. نمونهای از کلاسی را میپذیرد که رابط IDisposable را پیادهسازی میکند و مطمئن میشود که شی IDisposable که به عنوان پارامتر به آن ارسال میشود، بهطور خودکار با هر درخواست حذف میشود.
قطعه کد زیر نشان می دهد که چگونه می توانید از روش HttpResponse.RegisterForDispose برای ثبت نمونه ای از کلاس FileManager در پایان هر درخواست HTTP استفاده کنید.
public class DefaultController: ControllerBase {
readonly IDisposable _disposable;
public DefaultController() {
_disposable = new FileManager();
}
}
اشیاء قابل مصرف ID را با استفاده از ظرف داخلی IoC دور بیندازید
رویکرد دیگری برای دفع خودکار اشیاء قابل مصرف ID استفاده از محفظه داخلی IoC (وارونگی کنترل) در ASP.NET Core است. میتوانید از نمونههای Transient، Scoped یا Singleton برای سرویسهای ایجاد شده استفاده کنید و آنها را به ظرف IoC داخلی اضافه کنید.
اشیاء IDdisposable را به محفظه IoC در متد ConfigureServices کلاس Startup اضافه کنید تا آن اشیا به طور خودکار با هر درخواست HTTP حذف شوند.
اشیاء IDependency را با استفاده از رویدادهای IHostApplicationLifetime از بین ببرید
ASP.NET Core یک رابط به نام IHostApplicationLifetime دارد که به شما امکان می دهد کدهای سفارشی را هنگام راه اندازی یا خاموش شدن برنامه اجرا کنید. برای ثبت نام در رویدادها می توانید از روش ثبت این رابط استفاده کنید.
متد Configure کلاس Startup می تواند پارامترهای زیر را بپذیرد:
- IApplicationBuilder
- IHostingEnvironment
- IloggerFactory
- IHostApplicationLifetime
قطعه کد زیر نشان میدهد که چگونه میتوانید از رابط IHostApplicationLifetime برای ثبت اشیاء برای دفع هنگام خاموش شدن برنامه استفاده کنید.
public void Configure(IApplicationBuilder app, IHostApplicationLifetime hostApplicationLifetime) {
hostApplicationLifetime.ApplicationStopping.Register(OnShutdown);
}
private void OnShutdown() {
//Write your code here to dispose objects
}
در نهایت، توجه داشته باشید که Startup.cs به طور پیش فرض در ASP.NET Core 6 ایجاد نمی شود. شما باید یکی را به صورت دستی ایجاد کنید و سپس کد زیر را در فایل Program.cs بنویسید تا کلاس Startup را مشخص کنید. در برنامه استفاده شود.
var builder = WebApplication.CreateBuilder(args);
builder.Host.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
using var app = builder.Build();
app.Run();
برخلاف Finalize، ما از روش Dipose به صراحت برای آزادسازی منابع مدیریت نشده استفاده می کنیم. شما باید متد Dispose را به صراحت بر روی هر شیئی که آن را پیاده سازی می کند فراخوانی کنید تا منابع مدیریت نشده ای را که شی ممکن است برای آنها ارجاع داشته باشد آزاد کند.
در این مقاله ما چهار راه برای دور انداختن این اشیاء یکبار مصرف را بررسی کردهایم. ما میتوانیم با استفاده از عبارت «using»، با دور انداختن خودکار در پایان هر درخواست، با استفاده از ظرف IoC، و با بهرهگیری از رویدادهای IHostApplicationLifetime، اشیای قابل مصرف ID را از بین ببریم.
پست های مرتبط
نحوه استفاده از IDisposable در ASP.NET Core
نحوه استفاده از IDisposable در ASP.NET Core
نحوه استفاده از IDisposable در ASP.NET Core