پرووید
پرووید
خواندن ۳ دقیقه·۳ سال پیش

Domain Event چیست؟

وبسایت پرووید
وبسایت پرووید


در این قسمت از سری آموزش Tactical Domain-Driven Design از وب سایت پروید بحثمان در رابطه با Domain Even ها را آغاز خواهیم کرد. در بسیاری از Business Model ها نیاز به توصیف کردن وقایع و رخدادهایی که اتفاق می افتند نیز داریم. این رویداد ها و اتفاق ها که State و یا حالت مدل را تغییر میدهند را Domain Event مینامیم.

جالب است بدانید که در کتاب آقای Eric Evans در رابطه با Domain Event ها صحبت نشده است بلکه بحث Domain Event ها در Domain Driven Design در کتاب Vernon مطرح گردیده است.

یک Domain Event نمایانگر اتفاقی است که در Domain Model رخ میدهد و برای دیگر قسمت های سیستم حائز اهمیت است. در طراحی دامنه محور Domain Event ها میتوانند دانه درشت و یا اصطلاحا Coarse-Grained باشند. برای مثال یک Domain Event میتواند نمایانگر این باشد که یک Aggregate Root ایجاد شده است و یا یک Process آغاز گردیده است. علاوه بر این Domain Event ها میتوانند دانه ریز و یا اصطلاحا Fine-Grained نیز باشند. برای مثال اینکه یک ویژگی خاص از یک Aggregate Root خاص تغییر کرده است. به طور کلی Domain Event ها دارای ویژگی های زیر هستند:

  • آنها Immutable و یا غیر قابل تغییر هستند. دلیل این موضوع هم منطقی است چرا که اتفاقی که افتاده است را نمیتوان تغییر داد.
  • دارای یک Time Stamp هستند که مشخص کننده زمان رخ دادن Domain Event مورد نظر است.
  • میتوانند دارای یک ID منحصر به فرد باشند که با استفاده از آن بتوانیم یک Event را از یک Event دیگر تمیز بدهیم. این موضع بستگی به نوع Domain Event و همچنین نحوه توزیع شدن Event ها دارد.
  • توسط Aggregate Root ها و یا Domain Service ها منتشر و یا Publish میشوند. در رابطه با این موضوع بعدا بیشتر صحبت میکنیم.

پس از انتشار یک Domain Event آن Domain Event میتواند میتواند توسط Domain Event Listener ها دریافت بشود. Domain Event Listener به نوبه خود پردازش های دیگری را در پاسخ به Domain Event  رخ داده اجرا میکنند.  نکته دیگر اینکه منتظر کننده Domain Event که اصطلاحا به آن Publisher میگوییم، اطلاعاتی در رابطه با اینکه چه اتفاقی برای Event مورد نظر میافتد ندارد. علاوه بر این Domain Event Listener نیز نباید بر روی Publisher تاثیر گذار باشد. به عبارت دیگر انتشار Domain Event ها باید خالی از Side Effect و یا عوارض جانبی باشد. از همین جهت توصیه میشود که Domain Event Listener در تراکنش یکسانی که در آن Event مورد نظر Publish شده است اجرا نشوند.

از نقطه نظر طراحی بزرگترین مزیت Domain Event ها در این است که باعث میشوند سیستم قابل گسترش بشود. شما میتوانید با استفاده از Domain Event ها و اضافه کردن  Domain Event Listener های متعدد در پاسخ به انتشار یک Domain Event، Business Logic های مختلفی را بدون تغییر دادن کدهای از قبل موجود اجرا کنید. گسترش دادن کد نوشته شده بدون نیاز به تغییر دادن کدهایی که از قبل نوشته شده اند یکی از اصول SOLID هست که تحت عنوان Open Close Principle شناخته میشود. با استفاده از این خاصیت قابل گسترش بودن، میتوانید Event ها را با رشد برنامه اضافه کنید. ممکن است بعضی از Domain Event ها را در ابتدای کار بشناسید. اما بعضی دیگر با پیشرفت رفتن طراحی برنامه خود را نشان میدهند. ممکن است بگویید میتوان تمامی Domain Event های معمول و یا محتمل را در ابتدای کار به برنامه اضافه کرد، اما با استفاده از این روش ممکن است اصل Yagni که مخفف You aren't gonna need it را زیر پا بگذارید. روش بهتر این است که برنامه باز باشد تا بتوانید به راحتی در صورت لزوم Domain Event های جدید را اضافه و سپس انتشار بدهید.

منبع: وبسایت پرووید

شاید از این پست‌ها خوشتان بیاید