برای اینکه بتوانیم از RabbitMQ (Docker) استفاده کنیم باید یک کلاس واسط داشته باشیم که تنظیمات RabbitMQ داخلش قرار بگیره.
BuildingBlocks (Folder) -> EventBus.Messages (ClassLibrary) -> Events (Folder) :
Event هایی که قراره اتفاق بیافتد داخل این فولدر کنترل می شود.
دو مدل رویکرد داشتیم : Request/Response و Event ، که ما در اینجا از Event استفاده میکنیم.
نکته : هر دو پروژه ای (Publisher / Subscriber) که بخواد با این پروژه کار کند باید Add Reference کند و نکته مهم اینکه باید در داکر فایل هم آپدیت شود که مشخص کند که به یک پروژه دیگر متصل شده است.
برای این کار : داکر فایل مون رو پاک میکنیم : روی پروژه کلیک راست میکنیم -> add -> به جای استفاده از Docker workstation Support از خود Docker Support استفاده می کنیم -> هسته لینوکس رو انتخاب می کنیم . خودش برای ما داکر فایل را درست می کند و رفرنس ها به پروژه های دیگر رو هم اعمال می کنید.
چرا از Docker workstation Support استفاده نکردیم ؟
چون یکبار از این استفاده کردیم و در Docker-Compose ما تنظیماتش هست و فقط می خواستیم که داکر فایل برای این پروژه ساخته شود. بنابراین احتیاجی به تنظیم فایل docker-compose نداشتیم . همین.
یک کلاس پایه ایجاد می کنیم که بقیه کلاس هایی که ساختار Event رو می خوان پیاده سازی کنن از این کلاس ارث بری کنند :
using System;
namespace EventBus.Messages.Events
{
public class IntegrationBaseEvent
{
public IntegrationBaseEvent()
{
Id = Guid.NewGuid();
CreateDate = DateTime.UtcNow;
}
public IntegrationBaseEvent(Guid id, DateTime createDate)
{
Id = id;
CreateDate = createDate;
}
public Guid Id { get; private set; }
public DateTime CreateDate { get; private set; }
}
}
تو این فولدر یک کلاس دیگه احتیاج داریم برای رویداد Checkout مون ، که در واقع اطلاعاتی هستش که می خوایم ارسال بشن (Message مون) .
این رویداد پابلیش که میشه داخلش یکسری اطلاعات داریم که طرف Publisher ارسال میشه و اطلاعات را سمت Subscriber دریافت و پردازش می کنه.
namespace EventBus.Messages.Events
{
public class BasketCheckoutEvent : IntegrationBaseEvent
{
public string UserName { get; set; }
public decimal TotalPrice { get; set; }
// address
public string FirstName { get; set; }
public string LastName { get; set; }
public string EmailAddress { get; set; }
public string Country { get; set; }
public string City { get; set; }
// payment
public string BankName { get; set; }
public string RefCode { get; set; }
public int PaymentMethod { get; set; }
}
}
برای هر Event یک صف درست می کنیم و مسلماً یه اسمی داره ، پس داخل EventBus.Messages یک پوشه دیگری درست میکنیم به نام Common و یک کلاسی داخل آن ایجاد میکنیم (EventBusConstants.cs) و نام صف ها مون رو داخل آن قرار می دهیم
namespace EventBus.Messages.Common
{
public class EventBusConstants
{
public const string BasketCheckoutQueue = "basketcheckout-queue";
}
}