Notice: file_put_contents(): Write of 8675 bytes failed with errno=28 No space left on device in /var/www/tgoop/post.php on line 50

Warning: file_put_contents(): Only 12288 of 20963 bytes written, possibly out of free disk space in /var/www/tgoop/post.php on line 50
Web Devs@fullStackDevs P.446
FULLSTACKDEVS Telegram 446
ادامه پست قبل :
🌀 Specification pattern

نحوه استفاده از آن


// Controller
public void SomeMethod()
{
var specification = new GenericSpecification<Movie>(
m => m.MpaaRating == MpaaRating.G);
var movies = _repository.Find(specification); // Getting a list of movies
}

// Repository
public IReadOnlyList<Movie> Find(GenericSpecification<Movie> specification)
{
return db
.Where(specification.Expression)
.ToList();
}
🔹 اما در این روش هم باز همان مشکل قبل را داریم و کلاس جنریک specification در اینجا فقط به عنوان یک wrapper برروی expression قبلی مان عمل میکند پس نتیجه ای که میتوانیم بگیریم این است که GenericSpecification یک روش بد میباشد.چون فقط نقش یک Container را ایفا میکند که Client ها به اطلاعات خود را پاس میدهند و مشکل کپسوله سازی اطلاعات دامین مدل ها هنوز پا برجا و حل نشده باقی مانده است.

✔️ اما راهکار چیست؟

🔳 راه حل درست، استفاده از پیاده سازی ای از الگو specification تحت عنوان Strongly-typed specifications میباشد.
در این روش الگوی specification طوری پیاده سازی شده است که در آن اطلاعات دامین مدل نوشته شده و با کمترین امکان تغییر از خارج از کلاس پیاده سازی کننده پیاده سازی شده است. نحوه پیاده سازی :
public abstract class Specification<T>
{
public abstract Expression<Func<T , bool>> ToExpression();

public bool IsSatisfiedBy(T entity)
{
Func<T , bool> predicate = ToExpression().Compile();
return predicate(entity);
}
}
public class MpaaRatingAtMostSpecification : Specification<Movie>
{
private readonly MpaaRating_rating;

public MpaaRatingAtMostSpecification(MpaaRating rating)
{
_rating = rating;
}
public override Expression<Func<Movie, bool>> ToExpression()
{
return movie => movie.MpaaRating <= _rating;
}
}
// Controller
public void SomeMethod()
{
var gRating = new MpaaRatingAtMostSpecification(MpaaRating.G);
IReadOnlyList<Movie> movies = repository.Find(gRating); // Getting a list of movies
}
// Repository
public IReadOnlyList<T> Find(Specification<T> specification)
{

return db.Where(specification.ToExpression()).ToList();
}
}
🔸 در این روش باید به ازای هر شاخص یا عملگری که میخواهید به عنوان یک فیلتر بر روی DbSet انجام شود،باید کلاسی تعریف کنید که از ابستراکت کلاس Specification<T> ارث بری کرده و متد ToExpression() انرا override و پیاده سازی کند. مثلا در مثال بالا ما به ازای شاخص MpaaRating که یک enum در کلاس Movie بود .یک کلاس با نام MpaaRatingAtMostSpecification ایجاد کردیم که از ابستراکت کلاس Specification<T> ارث بری کرده و با override کردن ToExpression() و پیاده سازی آن به صورت :
public override Expression<Func<Movie, bool>> ToExpression()
{
return movie => movie.MpaaRating <= _rating;
}
شرط خود را نوشته و در سطح کنترلر اگر نیاز به فیلتر Movie ها بر اساس شاخص MpaaRating داشتیم با نمونه سازی از این کلاس به صورت :
var gRating = new MpaaRatingAtMostSpecification(MpaaRating.G);
IReadOnlyList<Movie> movies = repository.Find(gRating); // Getting a list of movies
و پاس دادن آن به متد Find ریپازیتوری خودمان :
// Repository
public IReadOnlyList<T> Find(Specification<T> specification)
{
return db.Where(specification.ToExpression())
.ToList();
}
آنرا بر روی Dbset<Movie> اعمال کنیم.پس اگر قرار باشد فیلتری براساس شاخص یا عملگر دیگری اعمال کنید باید یک کلاس جدیدبسازید که از ابستراکت کلاس Specification<T> ارث بری میکند و با پیاده سازی متد ToExpression() شرط مورد نظر خود بنویسید.


لینک مطلب


@fullStackDevs



tgoop.com/fullStackDevs/446
Create:
Last Update:

ادامه پست قبل :
🌀 Specification pattern

نحوه استفاده از آن


// Controller
public void SomeMethod()
{
var specification = new GenericSpecification<Movie>(
m => m.MpaaRating == MpaaRating.G);
var movies = _repository.Find(specification); // Getting a list of movies
}

// Repository
public IReadOnlyList<Movie> Find(GenericSpecification<Movie> specification)
{
return db
.Where(specification.Expression)
.ToList();
}
🔹 اما در این روش هم باز همان مشکل قبل را داریم و کلاس جنریک specification در اینجا فقط به عنوان یک wrapper برروی expression قبلی مان عمل میکند پس نتیجه ای که میتوانیم بگیریم این است که GenericSpecification یک روش بد میباشد.چون فقط نقش یک Container را ایفا میکند که Client ها به اطلاعات خود را پاس میدهند و مشکل کپسوله سازی اطلاعات دامین مدل ها هنوز پا برجا و حل نشده باقی مانده است.

✔️ اما راهکار چیست؟

🔳 راه حل درست، استفاده از پیاده سازی ای از الگو specification تحت عنوان Strongly-typed specifications میباشد.
در این روش الگوی specification طوری پیاده سازی شده است که در آن اطلاعات دامین مدل نوشته شده و با کمترین امکان تغییر از خارج از کلاس پیاده سازی کننده پیاده سازی شده است. نحوه پیاده سازی :
public abstract class Specification<T>
{
public abstract Expression<Func<T , bool>> ToExpression();

public bool IsSatisfiedBy(T entity)
{
Func<T , bool> predicate = ToExpression().Compile();
return predicate(entity);
}
}
public class MpaaRatingAtMostSpecification : Specification<Movie>
{
private readonly MpaaRating_rating;

public MpaaRatingAtMostSpecification(MpaaRating rating)
{
_rating = rating;
}
public override Expression<Func<Movie, bool>> ToExpression()
{
return movie => movie.MpaaRating <= _rating;
}
}
// Controller
public void SomeMethod()
{
var gRating = new MpaaRatingAtMostSpecification(MpaaRating.G);
IReadOnlyList<Movie> movies = repository.Find(gRating); // Getting a list of movies
}
// Repository
public IReadOnlyList<T> Find(Specification<T> specification)
{

return db.Where(specification.ToExpression()).ToList();
}
}
🔸 در این روش باید به ازای هر شاخص یا عملگری که میخواهید به عنوان یک فیلتر بر روی DbSet انجام شود،باید کلاسی تعریف کنید که از ابستراکت کلاس Specification<T> ارث بری کرده و متد ToExpression() انرا override و پیاده سازی کند. مثلا در مثال بالا ما به ازای شاخص MpaaRating که یک enum در کلاس Movie بود .یک کلاس با نام MpaaRatingAtMostSpecification ایجاد کردیم که از ابستراکت کلاس Specification<T> ارث بری کرده و با override کردن ToExpression() و پیاده سازی آن به صورت :
public override Expression<Func<Movie, bool>> ToExpression()
{
return movie => movie.MpaaRating <= _rating;
}
شرط خود را نوشته و در سطح کنترلر اگر نیاز به فیلتر Movie ها بر اساس شاخص MpaaRating داشتیم با نمونه سازی از این کلاس به صورت :
var gRating = new MpaaRatingAtMostSpecification(MpaaRating.G);
IReadOnlyList<Movie> movies = repository.Find(gRating); // Getting a list of movies
و پاس دادن آن به متد Find ریپازیتوری خودمان :
// Repository
public IReadOnlyList<T> Find(Specification<T> specification)
{
return db.Where(specification.ToExpression())
.ToList();
}
آنرا بر روی Dbset<Movie> اعمال کنیم.پس اگر قرار باشد فیلتری براساس شاخص یا عملگر دیگری اعمال کنید باید یک کلاس جدیدبسازید که از ابستراکت کلاس Specification<T> ارث بری میکند و با پیاده سازی متد ToExpression() شرط مورد نظر خود بنویسید.


لینک مطلب


@fullStackDevs

BY Web Devs


Share with your friend now:
tgoop.com/fullStackDevs/446

View MORE
Open in Telegram


Telegram News

Date: |

Done! Now you’re the proud owner of a Telegram channel. The next step is to set up and customize your channel. Deputy District Judge Peter Hui sentenced computer technician Ng Man-ho on Thursday, a month after the 27-year-old, who ran a Telegram group called SUCK Channel, was found guilty of seven charges of conspiring to incite others to commit illegal acts during the 2019 extradition bill protests and subsequent months. For crypto enthusiasts, there was the “gm” app, a self-described “meme app” which only allowed users to greet each other with “gm,” or “good morning,” a common acronym thrown around on Crypto Twitter and Discord. But the gm app was shut down back in September after a hacker reportedly gained access to user data. fire bomb molotov November 18 Dylan Hollingsworth yau ma tei Telegram is a leading cloud-based instant messages platform. It became popular in recent years for its privacy, speed, voice and video quality, and other unmatched features over its main competitor Whatsapp.
from us


Telegram Web Devs
FROM American