دسته بندی ها
00:16 1398/10/13

الگوی Unit of work چیست ؟

مشخصات سوال کننده :
کاربر : pedram_khan     امتیاز کاربر : 277     رتبه کاربر : 6
دسته بندی : Asp.net Core Asp.net Mvc

به این سوال امتیاز بدهید    1
تعداد بازدید این سوال : 11538
پاسخ دهنده : AliNoori 20:59 1398/10/13

ترجمه لفظی الگوی طراحی Unit of work الگوی طراحی واحد کار است. در این الگو تمام درخواست‌ ها در یک صف قرار می‌ گیرند و با پایان یافتن تمام کار ها بانک به‌ روز خواهد شد و دستور SaveChanges اجرا خواهد شد. اگر برنامه ای  داشته باشید که آن را چند لایه تهیه کرده باشید نباید در هر لایه از  DbContext استفاده کنید. بلکه فقط یک بار از کلاس DbContext نمونه ایجاد می‌ کنیم. برای حل این مشکل الگویی به نام الگوی Unit Of Work طراحی شده است که در لایه‌ های مختلف برنامه یک unit of work به اشتراک گذاشته می‌ شود.

این روش مزیت‌ های بسیاری دارد که یک نمونه از آن این است که کانکشنی که به بانک باز می‌ شود کمترین تعداد را دارد و با همان کانکشن باز کلیه عملیات انجام می‌ گیرد ، زمانی که از یک الگوی واحد کار استفاده می‌ کنیم امکان بررسی خودکار تغییرات انجام‌ شده بر روی یک Entity در لایه‌ های مختلف به‌ راحتی امکان‌ پذیر است.

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

ویرایش شده در چهارشنبه 19 اردیبهشت 1403 ساعت 19:39:58
به این پاسخ امتیاز بدهید    3
امتیاز: 136 رتبه: 11
پاسخ دهنده : saedbfd 20:36 1398/10/15

پاسخ AliNoori بسیار عالی و کامل بود. یک سری نکات هم بهش اضافه میکنم.

معمولا در پروژه ها یک سری عملیات دیتابیس هست که مرتبا تکرار میشه. این عملیات :

  • Insert یا Create
  • Update
  • Delete
  • Select یا Read

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

 

معماری پیاز

 

به همین خاطر میان و از لایه Service یا همون Interface ها استفاده می کنن تا ارتباط بین دیتابیس و کنترلر به صورت مستقیم برقرار نشه. دستورات CRUD معمولا در پروژه ها فقط یکبار و به صورت Generic نوشته میشن. یعنی یکبار نوشته میشن و در طول پروژه بارها از اون استفاده میشه.

 

حالا با این توضیحات استفاده از الگوی Unit Of Work یکسری مزایا داره :

چرا باید از الگوی Unit Of Work استفاده کرد

  • اولین دلیل استفاده از الگوی Unit Of Work عدم دسترسی مستقیم کنترلر به دیتابیس هنگام عملیات CRUD می باشد. چون در اینجا ارتباط با استفاده از کلاس و اینترفیس مربوط به Unit Of Work برقرار میشه.
  • دلیل دوم هم بحث افزایش امنیت دیتابیس می باشد.
  • و اما یکی از دلایل مهم استفاده از الگوی Unit Of Work این می باشد که اگر درخواستی نیاز به چندین بار ارتباط با دیتابیس باشد در هر ارتباط یک نمونه از دیتابیس در سرور ساخته می شود که اگر تعداد درخواست ها بالا باشه سرعت دیتابیس و سرور رو کند میکنه. اما در الگوی Unit Of Work کنترل میشه که در هر لحظه بیشتر از یک نمونه از دیتابیس وجود نداشته باشه.

برای آموزش کامل الگوی Unit Of Work میتونید این آموزش رو مشاهده بفرمایید.

ویرایش شده در چهارشنبه 19 اردیبهشت 1403 ساعت 19:40:26
به این پاسخ امتیاز بدهید    2
امتیاز: 1654 رتبه: 1
پاسخ دهنده : mohammad-i 13:01 1399/05/01

1- الگوی unit of work همیشه همراه با repository استفاده میشه یا به تنهایی هم قابل استفاده است؟

2- در پروژه های کوچیک که نیاز به ریپازیتوری و لایه سرویس نیست، میشه برای جلوگیری از تکرار، کلاس جنریک بدون ریپازیتوری ایجاد کرد؟

ویرایش شده در پنج شنبه 11 دی 1399 ساعت 13:23:19
به این پاسخ امتیاز بدهید    0
امتیاز: 260 رتبه: 7
1 نظر
saedbfd : کلا استفاده از هیچ الگو یا معماری اجباری نیست. اگر پروژه شما کوچک هست و می بینید پیاده سازی Unit Of Work یا کلاس های جنریک کار رو سخت تر می کنه میتونید این کار رو انجام ندید.

امتیاز کاربر : 1654   رتبه کاربر : 1   تاریخ ثبت : 01:24 1399/10/11
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود