آموزش عملی و پروژه محور Domain Driven Design و CQRS #8 قسمت هشتم از یک سری آموزشی از وبسایت پرووید است که در رابطه با Domain Driven Design و CQRS تنظیم شده است. پس از این دوره ی آموزشی می توانید از بسته های آموزشی وبسایت پرووید در رابطه با Domain Driven Design را استفاده کنید.

در قسمت قبلی از این آموزش در مورد نوشتن اولین تست صحبت کردیم.

اجرای تست و Fail شدن آن

جرای تست نوشته شده در قسمت بالا بدون شک باعث Fail شدن آن می شود اما این شکست جزئیات جالبی را در رابطه با این که در قسمت بعدی باید چه چیزی را پیاده سازی کنیم به ما میدهد.

در جزئیات مربوط به این شکست گفته شده است که TabAggregate که در حال حاضر OpenTab را Handle نمی‌کند.

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

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

برای اضافه کردن یک Command Handler جدید باید اینترفیس جنریک IHandleCommand را پیاده سازی کنید و Type Parameter این اینترفیس را با Command ی که قرار است Handle کند تنظیم کنید.

public class TabAggregate : Aggregate,
    IHandleCommand<OpenTab>
{
    public IEnumerable Handle(OpenTab c)
    {
        yield return new TabOpened
        {
            Id = c.Id,
            TableNumber = c.TableNumber,
            Waiter = c.Waiter
        };
    }
}

دقت کنید که پیاده‌سازی Handler برای OpenTab بسیار ساده است. فقط باید TabOpened را ایجاد کنید. علاوه بر این دقت کنید که از کلید واژه yield استفاده شده است تا بتوان صفر یا چندین Event را ساخت. در حال حاضر اجرا کردن تست ما با موفقیت انجام می شود.

ثبت سفارش

برای پیاده سازی فرآیند ثبت سفارش در ابتدا دو Event با نام های DrinksOrdered و FoodOrdered را به صورت زیر تعریف می کنیم.

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

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

public class OrderedItem
{
    public int MenuNumber;
    public string Description;
    public bool IsDrink;
    public decimal Price;
}

public class DrinksOrdered
{
    public Guid Id;
    public List<OrderedItem> Items;
}

public class FoodOrdered
{
    public Guid Id;
    public List<OrderedItem> Items;
}

هر دوی این Event ها از کلاس OrderItem به طور اشتراکی استفاده می کنند. دقت کنید که استقلال Event ها از همدیگر بسیار مهم است اما استفاده مجدد از کلاسی به این شکل مشکل ساز نخواهد بود. Command مربوط به ثبت سفارش با نام PlaceOrder شبیه زیر تعریف می شود.

public class PlaceOrder
{
    public Guid Id;
    public List<OrderedItem> Items;
}

در قسمت بعدی از این آموزش در مورد همین مبحث صحبت خواهیم کرد.

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

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