View Full Version : حرفه ای: Dispose کردن کانکشن ایجاد شده
سعید کشاورز
شنبه 02 تیر 1397, 15:21 عصر
سلام دوستان..
به صورت پیش فرض وقتی کنترلر Scafold میکنیم متد زیر در آخر هر کنترل پیاده سازی میشه
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
حالا وقتی BreakPoint میذاریم در هر اجرا وارد این متد Dispose میشه و پارامتر disposing که داره میگیره همیشه True هست...پس کی False میشه؟
حالا من یه پروژه دارم وقتی برنامه رو اجرا میکنم این متد دوبار اجرا میشه.. اصلا رو چه حسابی این متد اجرا میشه؟
hakim22
شنبه 02 تیر 1397, 17:38 عصر
کمی عجیبه چون من به خاطر ندارم تا به حال این متد در Scaffold ساخته شده باشه.
به طور کلی هر کنترلر بعد از تولید Response پاکسازی میشه و همیشه Dispose اتفاق میوفته. همینکار در EF برای دیتابیس هم میوفته و نیازی به این متد ندارید. مگر اینکه به دلیلی خودتون برای دیتابیس Connection ایجاد کرده باشید.
وقتی به صورت دستی Connection ایجاد می کنید وظیفه ی پاکسازی یا Dispose به عهده ی خود شماست. متد Dispose در کنترلر مادر تعریف شده و همیشه هم اجرا میشه.
همه ی کارهای یک کنترلر روی HttpContext انجام میشه. از اونجایی که داده های HttpContext برای هر درخواست بازسازی میشه پس معنی نداره که کنترلر رو حفظ کنیم. همیشه باید Dispose انجام بشه.
اگر سعی کنید یک کنترلر رو به صورت Singleton بارگذاری کنید به مشکل برخورد میکنید.
سعید کشاورز
شنبه 02 تیر 1397, 22:25 عصر
ممنون از شما...
گر اینکه به دلیلی خودتون برای دیتابیس Connection ایجاد کرده باشید.
منظورتون از این جمله یعنی چی؟ من به این صورت کار میکنم که توی هر کنترلر ApplicationdbContext رو New میکنم.. بعدش همین Context رو از طریق سازنده کلاس به لایه سرویس پاس میدم...بعدش از لایه سرویس به لایه Repository پاس میدم و در انتها از لایه ریپازیتوری به لایه BaseRepository که یه کلاس جنریک هست و T دریافت میکنه پاس میدم..
این روش باعث میشه Context برنامه من در سطح هر کنترلر یکی باشه و با یک Transaction کل عملیات رو انجام بدم که اگه خطایی اتفاق افتاد Rol back بشه..
حالا الان اینجا خودم کانکشن رو ایجاد کردم یا Ef مدیریت میکنه؟
hakim22
یک شنبه 03 تیر 1397, 00:48 صبح
در اینجا EF کانکشن رو مدیریت میکنه.
هر وقت در پروژه از دستور
MyDbContext.Database.Connection.Open()
استفاده کنید یعنی خودتون دستی کانکشن رو ایجاد کردید و باید خودتون هم Close کنید.
کل این پاس دادن هارو می توانید با یک سیستم تزریق وابستگی در یک خط انجام دهید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.