tgoop.com/fullStackDevs/470
Last Update:
#Caching
#قسمت_دوم
🔹در قسمت اول به معرفی caching و جزئیات آن در asp core پرداختیم . حال نوبت به پیاده سازی است.
همانطور که گفته بودیم در این قسمت با استفاده ار یک الگوی Structural مشکلی که وجود داشت را حل خواهیم کرد.
▪️این الگو ، الگوی Proxy میباشد . بیایید نگاهی به این الگو بیاندازیم.
▫️این الگو شئ ای را به وجود میاورد که به عنوان یک placeholder یا یک جایگزین برای شئ دیگری عمل میکند و وظیفه آن کنترل دسترسی به آن شی است.در این پست این شی را Proxy object مینامیم.
و همچنین شئ ای که Proxy object کنترل دسترسی را بروی آن انجام میدهد hidden object مینامیم.
✳️ چه زمانی از الگوی Proxy استفاده کنیم ⁉️
▪️اگر زمانی نیاز داشتید تا رفتار یک شئ (hidden object ) را تغییر دهید (منظور از تغییر رفتار یک شی یعنی افزودن عملیاتی قبل یا بعد از اجرای هر یک از متد های آن است)
بدون اینکه در تعریف متد های اصلی آن شی(hidden object ) تغییری دهید میتوانید از این الگو استفاده کنید همچنین استفاده از این الگو در سناریو های testing زمانی که میخواهید رفتار یک کلاس را در جاهایی بدون پیاده سازی ای برای آن جایگزین کنید، بسیار کاربردی خواهد بود.
حالا که با Proxy Pattern شدیم نوبت به استفاده از این الگو است .
🔹امروزه تقریبا همگی از الگوی Repository میکنیم همانطور که قبلا گفتیم " ریپازیتوری راه دسترسی ما به داده هاست ، این داده ها ممکن از از دیتابیس واکشی شوند یا اینکه از Cache خوانده شوند
" برای انجام این امر و همچنین انجام عملیات caching میخواهیم برای ریپازیتوری خود یک Proxy بنویسیم به طوری که قبل از صدا زده شدن متد های Repository مثل GetAll() فرایند چک کردن cache صورت گیرد و اگر داده ها در cache وجود داشتند به کاربر باز گردانده شوند.
▪️در این پست از روش Cache In Memory در AspNet Core استفاده میکنیم که برای فعال سازی آن باید سرویس زیر را در متد ConfigureServices کلاس startup اضافه کنید.
▫️services.AddMemoryCache();
بعد از انجام اینکار انحام عملیات in-memoryCache را از طریق اینترفیس IMemoryCache دسترسی خواهید داشت و با تزریق آن در متد سازنده (Constructor) کنترلر یا هر کلاس دیگری، وابستگی های آن در زمان اجرا توسط سیستم تزریق وابستگی تزریق میشود.
🔹موارد لازم برای پیاده سازی
▪️اینترفیس زیر ،اینترفیس ریپازیتوری میباشد که دارای یک متد GetAll() میباشد.
```public interface IStudentRepository
{
IEnumerable<Student> GetAll();
}```
▪️کلاس زیر هم ریپازیتوری میباشد که پیاده سازی کننده اینترفیس بالا است
```public class StudentRepository : IStudentRepository
{
public IEnumerable<Student> GetAll()
{
return dbContext.Students.ToList();
}
}```
▪️ حال proxy ریپازیتوری بدین شکل خواهد بود
```public class StudentRepositoryProxy
: IStudentRepository
{
private readonly IStudentRepository _studentRepository; private readonly IMemoryCache _memoryCache;
private const string CacheKey = "WebDevsTelegramChannel"; public StudentRepositoryProxy(ServiceResolver serviceAccessor,
IMemoryCache memoryCache)
{
_studentRepository = serviceAccessor("GetBasicObject");;
_memoryCache = memoryCache; }
public IEnumerable<Student> GetAll()
{
if (_memoryCache.TryGetValue(CacheKey, out object temp)) {
return _memoryCache.Get<IEnumerable<Student>>(CacheKey);
}
else {
var students = _studentRepository.GetAll();
_memoryCache.Set(CacheKey, students); return students;
}
}
}
```@fullStackDevs
BY Web Devs
Share with your friend now:
tgoop.com/fullStackDevs/470