• بررسی منطق Repository Pattern و شکل پیاده سازی آن در یک پروژه ASP.NET MVC قسمت دوم
بررسی منطق Repository Pattern و شکل پیاده سازی آن در یک پروژه ASP.NET MVC قسمت دوم
1395/02/14 - 11:36:25 // DataBase and Design Pattern // 0 نظر // 5858 بازدید

الان وقت پیاده سازی Repository Pattern به همراه Entity FrameWork است . ابتدا اجازه بدهید یک دیاگرام از Interface ها و کلاسهای درگیر در یک Repository را با هم ببینیم و بعد به سراغ پیاده سازی برویم.

بسمه تعالی

بررسی منطق Repository Pattern و شکل پیاده سازی آن در یک پروژه ASP.NET MVC قسمت دوم

الان وقت پیاده سازی Repository Pattern به همراه Entity FrameWork است . ابتدا اجازه بدهید یک دیاگرام از Interface ها و کلاسهای درگیر در یک Repository را با هم ببینیم و بعد به سراغ پیاده سازی برویم.

در ابتدا باید یک Repository Interface داشته باشیم .این Interface نقش یک Collection Of Objects In Memory را بازی خواهد کرد . پس قاعدتا حاوی متدهای Add و .. خواهد بود.

دقت کنید که Update و یا Save نداریم. پس از Interface باید این Interface از طریق یک کلاس که Repository مینامیم ، پیاده سازی گردد.

درون این Repository ما یک Generic DbContext خواهیم داشت. چون پیاده سازی سیستم مثال من برای یک سیستم مدیریت Course ها و ... خواهد بود ، نامگذاری و پیاده سازی من شبیه زیر خواهد بود .

خوب نامگذاری متدهای من و خود کلاس پیاده سازی کننده ICourseRespository مشابه تصویر بالا خواهد بود . مرحله بعدی UnitOfWork خواهد بود . ما به یک Interface مشابه Iunitofwork نیاز خواهیم داشت . بر اساس Entity هایی که در پروژه موجود خواهد بود ، وضعیتی مشابه زیر خواهیم داشت .

متد Complete مشخص کننده پایان UnitOfWork خواهد بود . این میتواند همان متد Save باشد ، ولی به دلایلی بهتر است حتی نام آنرا را هم Save نگذاریم تا کسی دچار گمراهی در پیاده سازی نگردد.بعد از روال ، به یک کلاس برای پیاده سازی UnitOfWork نیاز داریم.

خوب نموداری و Chart و .. دیگر بس است . باید به سراغ VS.NET رفت و پیاده سازی را آغاز نمود .

ابتدا نگاهی به IRepository بیندازیم .یک Generic Interface خواهیم داشت . در این Interface ، 3 گروه متد داریم . متدهایی برای Find ، متدهایی برای Add و متدهایی برای Remove .

متد Get براساس ID فقط یک رکورد به ما میدهد . GetAll همه رکوردها را و Find بر اساس یک عبارت جستجو انجام خواهد داد.مثلن میتوان از یک Lambda Expression برای پیدا کردن یک Object استفاده کرد .این شبیه همان Where در Linq میباشد.

متد Add یک رکورد و AddRange یک لیست از Object ها را اضافه خواهد نمود .وضعیت Remove هم مشابه خواهد بود.

باز هم تکرار میکنم که همانطور که میبینید این Interface یک Collection of Objects است و متدهای Save و ... ندارد .

خوب برویم پیاده سازی این Interfaceرا ببینیم.

این تصویر فقط چند خط اول این کلاس است . در اینجا DbContext را در متد سازنده میبینید . خود DbContext را هم Protected تعریف کردیم ، زیرا که در روند ارث بری Entity ها ، Protected Member ها به آسانی قابلیت دسترسی خواهیم داشت.

حالا مثلا به متد GetAll نگاه کنیم . این متد به Ienumerable بر میگرداند و همانطور که میدانید ، نباید یک IqueryAble بازگردانی کند تا در لایه های بالاتر به مشکل بر نخوریم .

با استفاده از Tolist دقیقا یک مقدار IenumerAble خواهم داشت . متدهای Add و .. هم مانند یک متد افزودن رکورد و ... ساده از EF خواهد بود و نکته خاصی ندارد و سورس هم برای دانلود خواهید داشت .

خوب حال وقت ایجاد IcourseRepository خواهد بود . این Interface از Generic Repository من ارث بری خواهد نمود . این ارث بری سبب داشتن همه متدهای Add و ... خواهد بود ، ولی به شکل زیر دو متد دیگر هم معرفی شده است .

این 2 متد هم Ienumerable باز میگردانند و حالا وقت پیاده سازی این Interface در یک کلاس میباشد .

خوب ارث بری چندگانه که در دات نت نداریم ، ولی با Interface ها این کار ممکن است . کلاس من الان از دو Interface ارث بری کرده است .

خوب این هم پیاده سازی بعضی از متدها در این کلاس . دقت کنید که حتی Paging هم در همین لایه پیاده سازی شده و با استفاده از Take و ... همینجا وضعیت Paging مشخص میشود . هیچ وقت این روند را در لایه های بالاتر انجام ندهید. برای PageSize یک مقدار Default هم داریم که الان مثلن روی 10 قرار دارد . با این کار بر اساس سیاست پروژه که الان 10 فرض شده ، حتی اگر مقدار ذکر نشود ، یکدفعه همه رکوردها دریافت نشده و سبب کاهش Performance و ... نخواهد شد .

نکته : در 99% اوقات ، اگر مجبور شدید همه رکوردها را یکباره صدا بزنید ، به منطق کاری خود شک کنید . یا طراحی دیتابیس شما غلط بوده یا سیاست کاری شما در جایی مشکل دارد .

تصویر زیر به شما نشان خواهد داد که چگونه Context را در همه جا به یک نام دلخواه Cast کرده و باز میگردانیم .

این روال در همه Repository های ما باید وجود داشته باشد.

دقت کنید که فعلا در سورس پروژه فقط فایلها وجود دارد و امکان Compileهنوز نیست .

مرحله بعدی رفتن به سراغ IunitofWork است که در بخش بعدی به آن خواهیم پرداخت .

دانلود سورس پروژه

علی کلاهدوزان
معرفی نویسنده : علی کلاهدوزان

سلام بر دوستان ،
شاید رایج است به عنوان پروفایل کاربر ، چند خطی راجع به خودم بنویسم ، ولی وضعیت کاری و سوابق من با یک جستجوی ساده در گوگل مشخص خواهد شد ، لذا سرتان را با مطالب بی مورد به درد نیاورم بهتر است . اگر نکته خاصی لازم بود بدانید در قسمت "ایلیا سافت در یک نگاه" به احتمال زیاد یافت خواهد شد . جزئیات بیشتر را سوال کنید ، آدرس ایمیل Ali@Kolahdoozan.com همیشه جوابگوی شماست .امیدوارم از مطالب سایت استفاده کرده باشید . شاد و پیروز باشید .

امتیاز به مطلب
           
نظرات کاربران
ارسال نظر