
دیزاین پترنRepositoryبرای اولینبار در کتابDomain-driven-design (DDD)در سال 2004 توسط اریک ایوانز معرفی شد. در همان اوایل که این پترن معرفی شد محبوبیت بالایی بین برنامهنویسان به دست آورد و توجه برنامه نویسان زیادی را به خود جلب کرد و در پروژههای زیادی مورداستفاده قرار گرفت و هنوز هم از محبوبیت بالایی بین برنامهنویسان برخوردار میباشد.
اگر نیاز به آموزش دیزاین پترنهای بیشتری در زبان سی شارپ دارید میتوانید دوره آموزش دیزاین پترن در زبان سی شارپ سایت باگتو را مشاهده نمایید. در این دوره 23 دیزاین پترنGoFرا آموزش دادهایم که پس از گذراندن این دوره تسلط کافی بر مهمترین دیزاین پترنهای دنیای معماری نرمافزار به دست میآورید.
دیزاین پترن ریپازیتوری(repository pattern) چیست؟
دیزاین پترن ریپازیتوری یک استراتژی برای دسترسی به دادهها ایجاد میکند و عملیاتهای مربوط به دادههای دیتابیس را برای ما انجام میدهد.
بهعنوانمثال فرض کنید در دیتابیسSQL Server یک جدول برای محصولات به نامtblProductدارید و با استفاده ازADO.NET عملیاتهایCRUDرا برای این جدول در برنامه خود انجام میدهید.
بهعنوانمثال برای عملیات اضافهکردن محصول جدیدی به جدولtblProductکد زیر را داریم.
SqlConnection cn = new SqlConnection("Data Source=DELL-PC.;initial catalog=ProductDb ; User ID=sa;Password=123;Integrated Security=SSPI;");
SqlCommand cmd = new SqlCommand("INSERT INTO dbo.Product (" + " Name, Price, " + ") VALUES (" + " @textBox1.Text, @textBox2.Text" + ")", cn);
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
حالا فرض کنید در قسمتهای مختلف برنامه نیاز داریم عملیاتهای مختلفی برای این جدول انجام دهیم. بعد از گذشت چند ماه کدهای زیادی برای کار با جداول دیتابیس در سرتاسر برنامه پخش میشوند.
حالا اگر قصد اعمال تغییرات در جداول دیتابیس داشته باشیم باید کدهای تکراری زیادی در اپلیکیشن را تغییر دهیم و هر تغییر کوچک نیاز زمان زیادی دارد و این زمان و هزینه زیادی از تیم توسعه را مصرف میکند.
راهکار چیست؟ راهکار استفاده از دیزاین پترن ریپازیتوری میباشد. با استفاده از ریپازیتوری میتوانیم عملیاتهای مربوط به دیتابیس را در یک کلاس جدا قرار دهیم و هرجا نیاز به عملیاتهای دیتابیسی داشتیم از این کلاس ریپازیتوری استفاده نماییم.
به این صورت اگر فیلدی به یک جدول اضافه شود و یا فیلدی کم شود فقط کلاس ریپازیتوری را تغییر میدهیم و توسعه و نگهداری پروژه هم بهآسانی انجام میشود.
دیزاین پترن ریپازیتوری چه مزیتهایی دارد؟
- جلوگیری از نوشتن کوئریهای تکراری در برنامه:
تصور کنید در اپلیکیشن خود نیاز دارید لیست محصولات را در 25 کنترلر و یا کلاس مختلف دریافت کنید. اگر از ریپازیتوری استفاده نکنید باید در این 25 کنترلر و یا کلاس همان کدهای تکراری دسترسی به دادهها را دوباره بنویسید.
و همین باعث میشود با کوچکترین تغییرات در دیتابیس نقاط زیادی از پروژه شما نیاز به تغییر داشته باشند. اما با استفاده از دیزاین پترن ریپازیتوری میتوانید در یک نقطه کد دریافت اطلاعات را از دیتابیس بنویسید و در جاهای مختلف برنامه از آن استفاده نمایید.
- اپلیکیشن را از لایه دسترسی به دادهها جدا میکند:
استفاده از دیزاین پترن ریپازیتوری باعث میشود که اپلیکیشن ما جدای از لایه دسترسی به دادهها شود و اتصال محکمی بین این دو برقرار نشود و اگر هم ازORMاستفاده میکنید با کمترین زحمت بتوانیدORMخود را تغییر دهید.
اگر ازEF Coreاستفاده کنیم نیاز به استفاده از دیزاین پترن ریپازیتوری هست؟
اگر نگاهی به سورسEFCoreداشته باشیم متوجه میشویم که در اینORMاز دیزاین پترنهایRepositoryوUnitOfWorkاستفاده شده است. بااینوجود چرا باید دوباره ازRepositoryاستفاده کنیم؟
پاسخ این سؤال این است که اگر ازEFCoreاستفاده میکنید از قبل برای شما دیزاین پترن ریپازیتوری پیادهسازی شده است و نیازی نیست شما یکلایه دیگر را اضافه کنید.
البته طبق گفته خود مایکروسافت در حالت عادی و نیازهای معمولی نیازی به استفاده مجدد دیزاین پترن ریپازیتوری ندارید.
اما اگر برنامه شما پیچیدهتر شود خود مایکروسافت هم توصیه میکند که از دیزاین پترن ریپازیتوری در اپلیکیشن خود استفاده نمایید. استفاده از ریپازیتوری باعث میشود کهUnittstها را راحتتر بنویسیم و آنها را اجرا کنیم. چون میتوانیمDbContext فیک را برای آن شبیهسازی کنیم.
البته اگر از ریپازیتوری هم استفاده نکنید برای شبیهسازیDbContextمیتوانید از پروایدرin Memoryکه یک دیتابیس موقت در حافظهRamایجاد میکند استفاده نمایید و بهراحتیunitTestهای خود را انجام دهید.
در تصویر زیر مقایسهای توسط مایکروسافت انجام شده که نشان میدهد اگر ازRepository patternاستفاده نماییم بهراحتی میتوانیم عملیاتMockرا برایDbContextانجام بدهیم و در عملUnitTestها هم بهراحتی با یکmock Repositoryاجرا میشوند
آیا در ADO.NET و یاDapperاز دیزاین پترن ریپازیتوری استفاده نماییم؟
اگر ازAdo.Netو یا ازmini Orm Dapperاستفاده میکنید به شما توصیه میکنم حتماً از دیزاین پترن ریپازیتوری استفاده نمایید.