چگونه از Dapper در Asp.net Core استفاده کنیم
همیشه یکی از مهمترین قسمت های برنامه نویسی، نحوه ارتباط برنامه نوشته شده و دیتابیس می باشد. این ارتباط به منظور اجرای دستورات CRUD می باشد. از روش های مختلفی از قبیل ADO.NET Classic یا Entity Framework برای این کار استفاده می کنیم. در این مقاله می خواهیم با ORM ی آشنا شویم که این ارتباط را بسیار خوب برقرار می کند و دارای سرعت بسیار خوبی در ایجاد ارتباط با دیتابیس و اجرای دستورات است. اگر شما قصد دارید عملیات CRUD را با Stored Procedure ها کنترل نمایید، Dapper یکی از بهترین پیشنهادها می باشد.
Dapper چیست؟
Dapper یک ORM کوچک، سبک و سریع می باشد که دارای محبوبیت زیادی است که وظیفه آن مدیریت ارتباط بین محیط برنامه نویسی و دیتابیس می باشد. شما با کمک Dappe می توانید به سادگی دستورات SQL خود را در قالب Stored Procedure و یا دستورات مستقیم SQL اجرا نمائید. Dapper کمک می کند قسمت هایی مانند مدیریت Connection ها، اجرا Command های SQL ای و همچنین تبدیل نتایج درخواست (Select Result) به ViewModel بسیار ساده و سریع انجام شود.
Dapper یک ابزار ساده نگاشت شی (Object Relational Mapping | ORM) برای داتنت به حساب میآید. Dapper به لحاظ سرعت عنوان پادشاه Micro ORM را از آن خود کرده و تقریباً سرعت آن در حد استفاده از یک خوانشگر داده خام ADO.NET است. Dapper رابط IDbConnection را با فراهم کردن متدهای افزونه (Extension Method) مفید برای جستجو (Query) پایگاه داده تعمیم میدهد. IDbConnection امکان پیادهسازی یک کلاس اتصال (Connection Class) را به وجود میآورد. Dapper در اصل برای استفاده در موقعیتهایی طراحی شده است که قصد کار با نوع دادههای نیرومند (Strongly Typed) به عنوان اشیا کسبوکار در یک اپلیکیشن داتنت وجود داشته باشد.
اتلاف وقت در کدنویسی برای نگاشت نتایج کوئری از خوانشگرهای داده ADO.NET به نمونههای (Instance) آن اشیا، با استفاده از Dapper از بین خواهد رفت. Dapper یک پروژه متنباز تحت مجوز آپاچی به حساب میآید. Dapper توسط Stackoverflow ساخته شده است. Stackoverflow بستری برای همکاری و اشتراک اطلاعات محسوب میشود. Dapper به صورت یک بسته نوگت (Nuget) در دسترس است و توسعهدهندگان بیش از ۱۶ میلیون بار آن را دانلود کردهاند. Nuget مدیر بسته رسمی داتنت به شمار میرود. برای درک بهتر اینکه Dapper چیست و مفاهیمی که در تعریف آن به کار گرفته شد، ابتدا بهتر است تعریفی از ORM ارائه شود. بنابراین، در ادامه به این سوال پاسخ داده شده است که ORM چیست؟ پیش از آن، دوره آموزش کاربرد Dapper ORM در #C (سی شارپ) معرفی شده است.
ORM چیست ؟
ORM سرنامی برای عبارت «Object Relational Mapping» و به معنی «نگاشت شی رابطهای» است که مسئولیت نگاشت بین پایگاه داده و زبان برنامهنویسی را برعهده دارد. ORM یک فن برنامهنویسی برای تبدیل دادهها میان پایگاه دادههای رابطهای و زبانهای برنامهنویسی شیگرا مثل جاوا، سیشارپ و سایر موارد است. ORMهای سنتی مثل Entity Framework، یک بسته کامل ORM به حساب میآیند. به این ترتیب، تعریف کوتاهی از ORM ارائه شد؛ اما آیا Dapper آنطور که «Dapper ORM» خوانده میشود، واقعاً ORM است و تمام امکانات یک ORM را ارائه میدهد؟ در ادامه به این سوال پاسخ داده شده است.
آیا Dapper یک ORM است؟ | میکرو ORM چیست؟
Dapper جز آن دسته از ابزارهایی است که به آنها micro-ORM یا ریز ORM گفته میشود. این ابزارها تنها بخشی از قابلیتهای یک نگاشتگر شی رابطهای کامل را اجرا میکنند. این ویژگیها بسته به محصول متفاوت هستند. در جدول زیر، ایده کلی از قابلیتهایی ارائه شده است که میتوان در یک میکرو ORM یافت و در واقع مقایسهای میان ORM و میکرو ORM صورت گرفته است:
میتوان از جدل فوق نتیجه گرفت که کارکرد Dapper روی حروف O و M در سرنام ORM یعنی عملیات «نگاشت شی» (Object Mapping) متمرکز شده است. در خصوص جدول بالا باید دو نکته را متذکر شد:
- افزونههایی به Dapper اضافه شده است که قابلیت کمینهای از ردیابی تغییرات (Change Tracking) را ارائه میدهند.
- Dapper در عمل کد SQL تولید میکند، اما این کار به صورت محدود انجام میشود.
بنابراین، مشخص شد که Dapper یک ORM کامل نیست و در دسته ریز ORMها قرار میگیرد. به زبان ساده، یک Micro-ORM، نگاشت پایگاه داده و اشیا داتنت را انجام میدهد. در ادامه برخی از مزیتهای یک میکرو ORM شرح داده شده است.
مزیتهای میکرو ORM چه هستند؟
در این بخش از مطلب آموزش Dapper برخی از مزیتهای میکرو ORMها فهرست شدهاند:
- میکرو ORMها معمولاً عملکرد بهتری در مقایسه با ORMهای سنتی دارند. تمرکز بر نگاشت دادههای پایگاه داده به نمایش کد (Code Representation) آنها به این معنا است که زمان کمتری برای انجام کارهای دیگر در حال صرف شدن است. به همین دلیل، میزان عملکرد برای ریز ORMها در سطح بهتری قرار دارد.
- در صورتی که پروژه مربوطه تنها دارای چند جدول پایگاه داده باشد، راهاندازی یکفریمورک ORM تمام عیار اضافهکاری محسوب میشود. برای پروژههای کوچک، نوشتن کوئریهای ساده SQL در داخل کدها احتمالاً نسبت به یک ORM سریعتر خواهد بود. با این وجود، در مورد فریمورک Entity، شروع و اجرای کار بسیار سادهسازی شده است. اما در صورتی که قرار است از ORM دیگری استفاده شود، یک میکرو ORM میتواند رویکرد سریعتری محسوب شود.
- در مواردی که اپلیکیشن به میزان زیادی از عملیات ذخیرهسازی در لایه نما (View) استفاده کند، میتوان دریافت که میکرو ORMها کد را سادهتر میسازند و نگهداری کدها با استفاده از یک میکرو ORM آسانتر است. دلیل این مسئله میتواند این باشد که لایه منطق در پایگاه داده واقع شده است. بنابراین، نیازی به همه قابلیتهای یک فریمورک ORM تمام عیار وجود نخواهد داشت.
- همانطور که پیشتر بیان شد، یک Micro-ORM با هر پایگاه دادهای کار میکند. توسعهدهنده میتواند کوئریهای SQL را خودش بنویسد، بنابراین تا زمانی که مهارت نوشتن کوئریهای بهینه SQL وجود داشته باشد، استفاده از یک میکرو ORM نسبت به ORMهای کاملی مثل فریمورک Entity انتخاب بهتری خواهد بود.
با وجود داشتن مزایای بسیار، فریمورکهای میکرو ORM دارای برخی کاستیها و معایب نیز هستند که در ادامه مطلب آموزش Dapper به شرح آنها پرداخته شده است.
معایب میکرو ORM
دانستن معایب میکرو ORMها میتواند در آموزش Dapper مفید واقع شود. در این بخش، برخی از معایب و نقاط ضعف یک Micro-ORM فهرست شدهاند:
- نوشتن کوئریهای SQL توسط خود فرد میتواند هم به عنوان یک مزیت و هم به عنوان یکی از معایب میکرو ORMها شمرده شود. این مسئله بستگی به میزان مهارت و بهینگی کدنویسی کوئریهای SQL دارد. به دلیل اینکه Entity Framework یا هر ORM دیگری کوئریها را بر اساس قوانین تعیین شده مینویسند، این امکان وجود دارد که در صورت کمدقتی و کمتوجهی کاربر، فریمورک Entity یا یک ORM دیگر کدهای کوئری SQL بهتری تولید کنند.
- یکی دیگر از معایب میکرو ORM این است که کار کردن با رابطهها و نگاشتها در میکرو ORM میتواند دشوار باشد. Micro-ORMها با اشیا واحد به خوبی کار میکنند، اما برای بارگذاری روابط در شی باید ساختار کوئریها را به شکل خاصی شکل داد. با این وجود، عملیات نگاشت در Dapper به میزان قابل توجهی بهبود داده شده است و در حال حاضر میتوان به راحتی نگاشت رابطهها را انجام داد. اما در هر صورت این عملیات به سادگی عملیات انجام شده در ORM نخواهد بود.
- در صورتی که نیاز به اعتبارسنجی گسترده وجود داشته باشد، بهتر است از ORMهای معمول استفاده شود. زیرا تمرکز اصلی میکرو ORMها بر عملیات نگاشت با سرعت بالاتر است که هزینه از دست دادن ویژگیهایی نظیر اعتبارسنجی را به دنبال خواهد داشت.
با شرح مزیتها و معایب Micor-ORM، این سوال به وجود میآید که کدام یک بهتر است؟ ORM یا Micro-ORM ؟ بنابراین، در ادامه آموزش Dapper به این سوال مهم پاسخ داده شده است.
ORM بهتر است یا میکرو ORM؟
این سوال دارای پاسخ ثابتی نیست. در واقع، پاسخ این سوال بسته به شرایط متفاوت است. در بسیاری از پروژهها، دستورالعملهایی ذخیره میشوند که برای منطق پیچیده مورد نیاز هستند. در چنین مواردی، یک ORM مثل Entity Framework پشتیبانی لازم را ارائه نمیدهد و Dapper راهکار مناسبی خواهد بود. در صورتی که اپلیکیشن مربوطه به یک اپلیکیشن CRUD نزدیک باشد و محاسبات پیچیده اندکی داشته باشد، بهتر است از Entity Framework استفاده شود.
اما در صورتی که منطق پیچیدهای در سمت پایگاه داده وجود داشته باشد، Dapper یا ترکیبی از Dapper و فریمورک Entity انتخاب مناسبی محسوب میشود. در صورتی که دغدغه اصلی بهینگی باشد، بهتر است از میکرو ORM استفاده شود. با پایان تعریف و نگاه کلی به ORMها و میکرو ORMها و بیان مزیتها و معایب آنها، در ادامه به صورت جزئی تر پیرامون Dapper بحث و به این سوال پاسخ داده شده است که چه زمانی باید از Dapper استفاده کرد؟
چه زمانی باید از Dapper استفاده کرد؟
برای تصمیمگیری در مورد اینکه چه زمانی از Dapper استفاده شود، باید دلیل اصلی موجودیت Dapper یعنی کارایی (عملکرد | Performance) را در نظر داشت. توسعهدهندگان اصلی Dapper از نیاکان Entity Framework Core یعنی LINQ to SQL که عمر کوتاهی داشت استفاده میکردند. آنها متوجه شدند که عملکرد کوئریها برای ترافیک در حال افزایش سایت (Stackoverflow) کافی نبود. بنابراین، میکرو ORM جدیدی را توسعه دادند و نام آن را Dapper گذاشتند.س