tgoop.com/fullStackDevs/471
Last Update:
#ادامه_پست_قبل
🔹کلاس StudentRepositoryProxy پیاده سازی کننده اینترفیس IStudentRepository و هم چنین خود کلاس ریپازیتوری ما (StudentRepository) نیز این اینترفیس را پیاده سازی کرده است . یعنی به ازای یک اینترفیس دو کلاس پیاده سازی کننده داریم با این تفاوت که جزئیات پیاده سازی درStudentRepository و جزئیتات Checking ها در StudentRepositoryProxy اعمال میشود. همچنین در داخل خود کلاس StudentRepositoryProxy به یک نمونه از StudentRepository نیاز داریم ( این مورد از قوائد پیاده سازی الگوی Proxy میباشد
) که این نمونه توسط سیستم تزریق وابستگی ساخته خواهد شد.
در واقع کلاس StudentRepositoryProxy به عنوان یک placeholder برای کلاس StudentRepository عمل میکند.
▪️در هنگام استفاده درخواست های خود را فقط و فقط به StudentRepositoryProxy خواهیم داد و این کلاس هست که بعد از اعمال و کنترل دسترسی و انجام Checking ها و فیلتر های تعریف شده قبل از اجرای متدهای ریپازیتوری با StudentRepository ارتباط برقرار کرده و داده ها درصورت لزوم cache میکند.اکنون برای Register کردن وابستگی ها یک چالش در پیش داریم چون به ازای یک اینترفیس دو کلاس پیاده سازی کننده داریم .
✳️چگونه به ازای یک اینترفیس دو یا چند سرویس را در DI Container پیشفرض Register کنیم⁉️
▪️برای حل این چالش از این تکنیک میتوانیم استفاده کنیم .یعنی در متد ConfigureServices سرویس ها را بدین شکل اضافه کنیم :
▫️ابتدا یک delegate به صورت پراپرتی برای کلاس startup تعریف میکنیم
public delegate IStudentRepository
ServiceResolver(string key);
و بعد سرویس ها را بدین گونه اضافه میکنیم.
```services.AddScoped<StudentRepository>();
services.AddScoped<StudentRepositoryProxy>();services.AddTransient<ServiceResolver>
(serviceProvider =>key
=>key
{
switch (
)"GetBasicObject"
{
case
:serviceProvider.GetService<StudentRepository>();
return
case"GetProxyObject"
:serviceProvider.GetService<StudentRepositoryProxy>();
return
default
:new KeyNotFoundException();
throw
}▪️ پس از انجام این مراحل از این به بعد قادر خواهید بود تا در هر کنترلر یا ApplicationBusinessService یا هر جایی که لازم دارید که از
});```
IStudentRepository
استفاده کنید و میتوانید بدین شکل عمل کنید :▫️اگر نیاز به چک کردن و همچنین cache کردن اطلاعات داشتید پس باید به ازاری اینترفیس
IStudentRepository
یک نمونه از StudentRepositoryProxy در زمان اجرا ساخته شود که این امر با پاس دادن مقدار کلید "GetProxyObject" به دلیگیت ServiceResolver مشخص میشود. بدین شکل :```public class StudentsController
{
private readonly IStudentRepository _studentRepositoryProxy;
public StudentsController(
ServiceResolver serviceAccessor)
{
_studentRepositoryProxy =
serviceAccessor("GetProxyObject
"); }
}```
▫️ اگر هم میخواستید از داده های orginal استفاده کنید و عملیات checking ای برای cache کردن داده ها صورت نگیرد کافیست از سیستم تزریق وابستگی بخواهید تا به ازای اینترفیس IStudentRepository
یک نمونه از کلاس StudentRepository
بسازد. این امر با پاس دادن مقدار کلید "GetBasicObject" به دلیگیت ServiceResolver مشخص میشود. بدین شکل :public
StudentsController(ServiceResolver serviceAccessor)
{
_studentRepositoryProxy =
serviceAccessor("GetBasicObject");}
🔻نکته : Register کردن دو یا چند سرویس به ازای یک interface در دیگر Di Container هایی مانند
Autofac
و Windsor وStructureMap
به راحتی امکان پذیر است.🔻نکته بعدی در مورد caching در این پست MemoryCacheEntryOptions است که با ساخت یک نمونه از روی این کلاس و پاس دادن ان به متد _memoryCacheObject.Set() در هنگام افزودن داده ها درون cache میتوانید برای آن تنظیماتی از جمله size و AbsoluteExpiration و Priority و .. اعمال کنید .
🌀سورس این پست را در اینجا میتوانید بررسی کنید.
@fullStackDevs
BY Web Devs
Share with your friend now:
tgoop.com/fullStackDevs/471