PDA

View Full Version : متدهای مشتریک در الگوی Repository



mmbguide
پنج شنبه 01 اردیبهشت 1401, 22:13 عصر
سلام دوستان

در برنامه از الگوی repository استفاده می کنم. و میخواستم درست و یا غلط بودن این روش رو بدونم. ابتدا یک کلاس از نوع Interface ایجاد کردم و متدهای مورد نظر را تعریف کردم. و در کلاس repository بدنه متدها را پیاده سازی کردم. اما با توجه به اینکه در برنامه های Asp.Net با استفاده از Scaffolding متدهایی با نام های از پیش تعریف شده در Controller ایجاد میشه و برای جلوگیری از ویرایش نام ها من در برنامه خودم پیاده سازی چند متد رو برای تمام repositoryها اجباری کردم. البته ممکنه بعضی ها نیاز به بدنه نداشته باشند و بصورت NotImplemented باقی بمانند.

public interface IGeneralMethod<T> where T : class
{
//Add new entity to database
void Add(T model);


//If exist current entity, then update new values by calling Update method
void AddOrUpdate(T model);


//update
void Update(T model);


//Delete
void Delete(T model);


//Delete entity rom database By Id
void DeleteById(int id);


//find entity from database by Id
T Find(int? id);


//find entity from database by defining Where clause
T FindBy(Expression<Func<T, bool>> predicate);


//check if exist in database
bool Any(Expression<Func<T, bool>> predicate);


//get all rows from database
List<T> ToList();


//get all rows from database by defining Where caluse
List<T> ToList(Expression<Func<T, bool>> predicate);


}



برای جلوگیری از تایپ اضافه من یک Interface عمومی ایجاد کردم که خود Interfaceها باید از اون ارث بری کنند و عملا لیست متدهای بالا برای تمام Interfaceها مشترک هستش. فقط کلاس هایی که به متدهای بیشتری نیاز داشته باشند می توانند متدهای بیشتری براشون تعریف کرد.

حالا سوالاتی در این خصوص دارم:

بعضی از متدها یک ورودی از نوع Expression میگیرند و استفاده کننده از repository میتونه شرط خودش را در زمان استفاده از متد اعمال بکنه. آیا این روش صحیح است که به استفاده کننده اجازه ارسال شرط بدیم؟ یا باید برای تمام حالات متدهای مختلفی بنویسیم؟
زمانی که مستیما از context استفاده میکنیم امکان استفاده از متد Include وجود داره ولی در استفاده از مدل UnitOfWork که repositoryها بصورت متغیر تعریف میشند و context از سمت client به سازنده ارسال میشه و یا اینکه در خود کلاس UnitOfWork نمونه سازی میشه دیگه اجازه استفاده از include را ندارم و انگار این متد را نمیشانه. سوالم اینکه که ایا باید در repository تمام includeها را اعمال کنم یا راه حل دیگه ای داره؟
علت اینکه دستورات مشترک را بصورت یک Generic Repository ننوشتم این هستش که در اجرای هر یک از دستورات تقریبا عملیات های متفاوتی در Add شدن اطلاعات در جداول مختلف هست و باید خود repository شرایط را بررسی و سپس Add رو انجام بده.


بطور کل اگر راهنمایی و پیشنهاداتی در خصوص روشی که پیاده کردم ارئه کنید ممنون میشم. تشکر

aliramazani
دوشنبه 05 اردیبهشت 1401, 22:53 عصر
در ASP Core از Unit Of Work و Generic Repository استفاده نمی کنند. خود Context خودش unit of work هستش.
از Services استفاده می شه معمولا یا معماری Clean و از این قبیل.
اجازه نده حساسیت به معماری پیدا کنی چون تو پروژه بزرگ بیشتر گیج میش