مقاله ی ایجاد اشیا با روش های برتر در Domain Driven Design را در این قسمت از وبسایت آموزش برنامه نویسی پرووید به شما تقدیم می کنیم.

ایجاد اشیا با روش های برتر در Domain Driven Design #3

تعریف Root

در Domain Driven Design علت اهمیت Aggregate Root این است که در یک Aggregate وظیفه اطمینان حاصل کردن از اینکه تمامی Entity ها در یک Valid State یا حالت معتبر هستند به عهده Aggregate Root است. این Valid State هم در زمان بازیابی Aggregate از بانک اطلاعاتی و هم در زمانی انجام هر تغییری بر روی آن Aggregate بررسی می شود. بگذارید این قضیه را با یک مثال مطرح کنیم.

بسته ی آموزش کاربردی طراحی نرم افزار Domain Driven Design

از شما دعوت می کنیم از بسته ی آموزش کاربردی طراحی نرم افزار Domain Driven Design دیدن کنید.

بسته ی آموزش اصول طراحی نرم افزار Domain Driven Design

از شما دعوت می کنیم از بسته ی آموزش اصول طراحی نرم افزار Domain Driven Design دیدن کنید.

یکی از کارهایی که در برنامه نمونه من باید انجام شود قابلیت اضافه کردن و حذف کردن یک شی Adjustment به SalesOrder است. بر اساس اصول Domain Driven Design طراحی ابتدایی Aggregate من بسیار ضعیف است چرا که برنامه نویس می‌تواند با استفاده از SalesOrder اشیایی از نوع Adjustment را شبیه کد زیر اضافه کند.

Dim so As New SalesOrder("A123")
so.Adjustments.Add(new Adjustment(AdjustmentTypes.CostWaived))

اگر بخواهیم طراحی این Aggregate را بهبود ببخشیم باید Adjustments به عنوان یک Read-Only Property که یک کالکشن می باشد تعریف کنیم. پس از آن که با استفاده از SalesOrder می‌توانیم اقدام به اضافه کردن و حذف کردن اشیای از نوع Adjustment کنیم. با داشتن یک Aggregate با این تعریف یک برنامه نویس باید از کد زیر برای اضافه کردن یک Adjustment به شکل زیر عمل کند.

Dim so As New SalesOrder("A123")
so.AddAdjustment(AdjustmentTypes.CostWaived)
<

با استفاده از کد بالا Aggregate Root می تواند Adjustment هایی که اضافه شده اند را بررسی کرده و اطمینان حاصل کند که تمامی Adjustment ها Validate شده اند. دقت کنید که پیاده سازی چنین کنترلی برای هر کدام از Entity های درون یک Aggregate کار بسیار دشواری می‌تواند باشد. هر چند که در مثال فعلی ما می‌توانیم Adjustment ها را به یک SalesOrder اضافه یا از آن حذف کنیم اما SalesOrderDetail ها قابل به روز رسانی می باشند. مدیریت کردن هر به روز رسانی بر روی SalesOrderDetail از طریق Aggregate Root می تواند کار دشواری باشد. در چنین سناریویی یکی از گزینه‌های جایگزین این است که Aggregate Root را به عنوان یک نقطه مرکزی برای انجام Validation بر روی بقیه Entity های درون Aggregate در نظر بگیریم. یکی از راه‌های پیاده سازی چنین کاری تعریف یک پروپرتی به نام IsSaveable بر روی Aggregate Root است که بر اساس Validation ی که بر روی بقیه Entity های Aggregate انجام میدهد مقدار True یا False برمی‌گرداند. در چنین پیاده‌سازی Aggregate Root می تواند از SalesOrderDetail برای انجام بعضی از کارهای Validation استفاده کند. لطفاً کد زیر را ببینید.

Dim so As New SalesOrder("A123")
so.Details(0).Quantity = -1
If so.IsSaveable Then
  ...saving the sales order...
Else
  MessageBox.Show("Sales order not valid")
End If

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *