معرفی دیزاین پترن ریپازیتوری(repository pattern )

معرفی دیزاین پترن ریپازیتوری(repository pattern )
فهرست مقاله [نمایش]

    دیزاین پترن Repository برای اولین‌بار در کتاب Domain-driven-design (DDD) در سال 2004 توسط اریک ایوانز معرفی شد. در همان اوایل که این پترن معرفی شد محبوبیت بالایی بین برنامه‌نویسان به دست آورد و توجه برنامه نویسان زیادی را به خود جلب کرد و در پروژه‌های زیادی مورداستفاده قرار گرفت و هنوز هم از محبوبیت بالایی بین برنامه‌نویسان برخوردار می‌باشد.

    اگر نیاز به آموزش دیزاین پترن‌های بیشتری در زبان سی شارپ دارید می‌توانید دوره آموزش دیزاین پترن‌ در زبان سی شارپ سایت باگتو را مشاهده نمایید. در این دوره 23 دیزاین پترن GoF را آموزش داده‌ایم که پس از گذراندن این دوره تسلط کافی بر مهم‌ترین دیزاین پترن‌های دنیای معماری نرم‌افزار به دست می‌آورید.

    repository pattern

     

    دیزاین پترن ریپازیتوری(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();

     

    حالا فرض کنید در قسمت‌های مختلف برنامه نیاز داریم عملیات‌های مختلفی برای این جدول انجام دهیم. بعد از گذشت چند ماه کدهای زیادی برای کار با جداول دیتابیس در سرتاسر برنامه پخش می‌شوند.

    حالا اگر قصد اعمال تغییرات در جداول دیتابیس داشته باشیم باید کدهای تکراری زیادی در اپلیکیشن را تغییر دهیم و هر تغییر کوچک نیاز زمان زیادی دارد و این زمان و هزینه زیادی از تیم توسعه را مصرف می‌کند.

    راهکار چیست؟ راهکار استفاده از دیزاین پترن ریپازیتوری می‌باشد. با استفاده از ریپازیتوری می‌توانیم عملیات‌های مربوط به دیتابیس را در یک کلاس جدا قرار دهیم و هرجا نیاز به عملیات‌های دیتابیسی داشتیم از این کلاس ریپازیتوری استفاده نماییم.

    به این صورت اگر فیلدی به یک جدول اضافه شود و یا فیلدی کم شود فقط کلاس ریپازیتوری را تغییر می‌دهیم و توسعه و نگهداری پروژه هم به‌آسانی انجام می‌شود.

     

    دیزاین پترن ریپازیتوری چه مزیت‌هایی دارد؟

    1. جلوگیری از نوشتن کوئری‌های تکراری در برنامه:

    تصور کنید در اپلیکیشن خود نیاز دارید لیست محصولات را در 25 کنترلر و یا کلاس مختلف دریافت کنید. اگر از ریپازیتوری استفاده نکنید باید در این 25 کنترلر و یا کلاس همان کدهای تکراری دسترسی به داده‌ها را دوباره بنویسید.

    و همین باعث می‌شود با کوچک‌ترین تغییرات در دیتابیس نقاط زیادی از پروژه شما نیاز به تغییر داشته باشند. اما با استفاده از دیزاین پترن ریپازیتوری می‌توانید در یک نقطه کد دریافت اطلاعات را از دیتابیس بنویسید و در جاهای مختلف برنامه از آن استفاده نمایید.

    1. اپلیکیشن را از لایه دسترسی به داده‌ها جدا می‌کند:

    استفاده از دیزاین پترن ریپازیتوری باعث می‌شود که اپلیکیشن ما جدای از لایه دسترسی به داده‌ها شود و اتصال محکمی بین این دو برقرار نشود و اگر هم از 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 استفاده می‌کنید به شما توصیه می‌کنم حتماً از دیزاین پترن ریپازیتوری استفاده نمایید.

     

     

     


    • نویسنده: روشن احمدی

    ارسال دیدگاه

    برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربری‌تان شوید


    دیدگاه کاربران