View Full Version : لود کردن صفحه به صورت lazy loading
sonicuser
شنبه 08 اسفند 1394, 05:20 صبح
سلام دوستان کی میتونه در مورد lazy loading و اینکه چطور میشه پیاده سازیش کرد توضیح بده؟؟
sonicuser
یک شنبه 09 اسفند 1394, 06:52 صبح
یعنی کسی کار نکرده تا حالا ؟؟؟؟:متفکر:
ali_md110
یک شنبه 09 اسفند 1394, 09:08 صبح
منظورتون Lazy Loading توی entity framework هست یا lazy
initialization
یا همون وهله سازی با تاخیر هست؟
در entity framework مثال میزنم متوجه بشید
فرض کنیم 2 موجودیت person و Details داریم که رابطه یک به جند دارند و navigation property ها هم تعریف شده
جدول details جزئیات جدول person هست فرض کنیم لیست جدول details رو میخایم بدست بیاریم
var detail=context.details.tolist();
این دستور لامبدا لیست جدول جزئیات را لود کرده و در یک گراید وبو نمایش میدهد چنانچه بخواهیم فیلدی از جدول perosn هم توی این گرادویو نمایش بدهیم کافی است آن فیلد را به یکی از ستونهای گراید بایند کنیم
بدین صورت person.FirstName
در اینجا از lazy Loiading استفاده شده یعنی ما زمانی که به جدول person نیاز داریم آنرا صدا زدیم اگر فیلد person.firstname رو حذف کنیم دیگر lazy اتفاق نمیوفته
ولی این lazy در این موارد خیلی مناسب نیست فرض کنیم جدول details دارای 100 رکورد هست و ازlazy استفاده کرده ایم
در این صورت ef به ازای هر یک سطر details برای نشان دادن فیلد firstname جدول person تعداد 100 کوئری به سمت بانک برنامه ارسال میکنه که خودش میشه مثل بمپ و برنامه را حسابی کند میکنه
راه حل چیست؟
بگار گیری eager loading یعنی به لامبدا بگیم همون وقتی که دستور صادر میکنی فیلدهای جدول person هم بیاور در کوئری و به کاربر نشان بده
کافی هست دستور بالایی رو تغییر بدیم
var detail = context.details.Include(x => x.person).ToList();
در اینجا از include برای این کار استفاده شده
ووقتی که برنامه اجرا میشود فقط یک درخواست به بانک ارسال شده و از ترافیک جلوگیری میشود
اگر یک برنامه profiler نصب کنید تعداد درخواستهای ارسال شده در دو روش قابل مشاهده هست
و در باره lazy initializ
فرض کنید در برنامهی خود کلاسی داریم دارای سازنده و این سازنده خیلی سنگین هست و یک سری محاسبات درونش انجام میشه و پرهزینه است. حالا نیاز داریم در یک جای دیگه از برنامه از این کلاس اثتفاده کنیم و نیازی نیست تا بلافاصله پس از تعریف، این شیء ساخته شود و در حافظه قرار گیرد و تنها زمانیکه به آن نیاز داریم باید در دسترس باشد. کلاس Lazy جهت مدیریت اینگونه مواردهست. تنها کاری که در اینجا باید صورت گیرد، این است که توسط کلاس Lazy این کلاس سنگین را مدیریت کرده و و موقعی که ب آن نیاز است صدا زده شود
فرض کنیم برنامه ای داریم و دارای یک کلاس هست که این کلاس باید همون ابتدا وهله سازی شده و استفاده بشه
کلاس زیر
public class ItemViewModel
{
private readonly Lazy<IClass> _myclass;
public ItemViewModel(Lazy<IClass> myclass)
{
__myclass = myclass;
}
این کلاس یک سازنده دارد.و یک پارامتر بنام myclass که به آن تزریق شده
این پارامتر در واقغ یک واسط هست که فرض میکنیم تعداد ریادی متد دارد
وقتی برنامه شروع شد اگر این کلاس را وهله سازی کنیم این کلاس چون سازنده پارامتری داره خواه نا خواه هنگام وهله سازی پارامترهای اون درون حافظه ریخته میشه ولی ممکنه این پارامتر در همه متدهای کلاس ItemViewModel کاربرد نداشته باشه پس بی جهت همون ابتدا درون حافظه ریخته نشود بهتر است چاره کار استفاده از lazy هست
و در اینجا از lazy استفاده شده و تا زمیانیکه فیلد myclass در متد یا جایی صدا زده نشه و از توابع درون استفاده نشه هیچ حافظه ای به اون اختصاص پیدا نمیکنه
sonicuser
یک شنبه 09 اسفند 1394, 09:45 صبح
منظورتون Lazy Loading توی entity framework هست یا lazy
initialization
یا همون وهله سازی با تاخیر هست؟
در entity framework مثال میزنم متوجه بشید
فرض کنیم 2 موجودیت person و Details داریم که رابطه یک به جند دارند و navigation property ها هم تعریف شده
جدول details جزئیات جدول person هست فرض کنیم لیست جدول details رو میخایم بدست بیاریم
var detail=context.details.tolist();
این دستور لامبدا لیست جدول جزئیات را لود کرده و در یک گراید وبو نمایش میدهد چنانچه بخواهیم فیلدی از جدول perosn هم توی این گرادویو نمایش بدهیم کافی است آن فیلد را به یکی از ستونهای گراید بایند کنیم
بدین صورت person.FirstName
در اینجا از lazy Loiading استفاده شده یعنی ما زمانی که به جدول person نیاز داریم آنرا صدا زدیم اگر فیلد person.firstname رو حذف کنیم دیگر lazy اتفاق نمیوفته
ولی این lazy در این موارد خیلی مناسب نیست فرض کنیم جدول details دارای 100 رکورد هست و ازlazy استفاده کرده ایم
در این صورت ef به ازای هر یک سطر details برای نشان دادن فیلد firstname جدول person تعداد 100 کوئری به سمت بانک برنامه ارسال میکنه که خودش میشه مثل بمپ و برنامه را حسابی کند میکنه
راه حل چیست؟
بگار گیری eager loading یعنی به لامبدا بگیم همون وقتی که دستور صادر میکنی فیلدهای جدول person هم بیاور در کوئری و به کاربر نشان بده
کافی هست دستور بالایی رو تغییر بدیم
var detail = context.details.Include(x => x.person).ToList();
در اینجا از include برای این کار استفاده شده
ووقتی که برنامه اجرا میشود فقط یک درخواست به بانک ارسال شده و از ترافیک جلوگیری میشود
اگر یک برنامه profiler نصب کنید تعداد درخواستهای ارسال شده در دو روش قابل مشاهده هست
و در باره lazy initializ
فرض کنید در برنامهی خود کلاسی داریم دارای سازنده و این سازنده خیلی سنگین هست و یک سری محاسبات درونش انجام میشه و پرهزینه است. حالا نیاز داریم در یک جای دیگه از برنامه از این کلاس اثتفاده کنیم و نیازی نیست تا بلافاصله پس از تعریف، این شیء ساخته شود و در حافظه قرار گیرد و تنها زمانیکه به آن نیاز داریم باید در دسترس باشد. کلاس Lazy جهت مدیریت اینگونه مواردهست. تنها کاری که در اینجا باید صورت گیرد، این است که توسط کلاس Lazy این کلاس سنگین را مدیریت کرده و و موقعی که ب آن نیاز است صدا زده شود
فرض کنیم برنامه ای داریم و دارای یک کلاس هست که این کلاس باید همون ابتدا وهله سازی شده و استفاده بشه
کلاس زیر
public class ItemViewModel
{
private readonly Lazy<IClass> _myclass;
public ItemViewModel(Lazy<IClass> myclass)
{
__myclass = myclass;
}
این کلاس یک سازنده دارد.و یک پارامتر بنام myclass که به آن تزریق شده
این پارامتر در واقغ یک واسط هست که فرض میکنیم تعداد ریادی متد دارد
وقتی برنامه شروع شد اگر این کلاس را وهله سازی کنیم این کلاس چون سازنده پارامتری داره خواه نا خواه هنگام وهله سازی پارامترهای اون درون حافظه ریخته میشه ولی ممکنه این پارامتر در همه متدهای کلاس ItemViewModel کاربرد نداشته باشه پس بی جهت همون ابتدا درون حافظه ریخته نشود بهتر است چاره کار استفاده از lazy هست
و در اینجا از lazy استفاده شده و تا زمیانیکه فیلد myclass در متد یا جایی صدا زده نشه و از توابع درون استفاده نشه هیچ حافظه ای به اون اختصاص پیدا نمیکنه
ممنون از راهنمایی عالیتون خیلی خوب توضیح دادین .
من مد نظرم چیزی شبیه لود شدن سایت بازار هست که وقتی اسکول به انتهای صفحه میرسه بقیه آیتمها لود میشن
مثلا اینجارو ببینید
https://cafebazaar.ir/lists/tools-top-rated/?l=fa
ali_md110
یک شنبه 09 اسفند 1394, 10:28 صبح
خب از همون اول بگید تا بریم سر اصل مطلب:قهقهه::قهقهه:
نه اینکه دوساعتی بشینم توضیح بدم lazy چی هست
این آدرس ببینید کمکتون میکنه
https://www.devtxt.com/blog/asp-net-mvc-infinite-scrolling
sonicuser
یک شنبه 09 اسفند 1394, 10:40 صبح
خب از همون اول بگید تا بریم سر اصل مطلب:قهقهه::قهقهه:
نه اینکه دوساعتی بشینم توضیح بدم lazy چی هست
این آدرس ببینید کمکتون میکنه
https://www.devtxt.com/blog/asp-net-mvc-infinite-scrolling
شرمنده سوادم نم کشیده :ناراحت:
مرسی از راهنماییت حالا باس برم سر تفسیر انگلیسی به مغزم :چشمک:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.