مکان ساختن آبجکت های لایه Domain موقع استفاده از CQRS
سلام
میخواستم بدونم ما وقتی میایم Command و CommandHandler هامونو میسازیم، بعد مثلا توی Command که به صورت record هست، میایم پارامتر هارو میگیریم از یوزر، حالا ما باید بیایم توی خود CommandHandler مثلا اون شی رو بسازیم و پاسش بدیم به لایه Domain یا مستقیم همون پارامتر ها رو پاس بدیم به لایه Domain بعد توی خود انتیتی، اون پارامتر هارو داخل یه متود بگیریم و ازش آبجکت مورد نیازمون رو بسازیم؟
یه مثال اگر تونستم توی پاسخ پایینی مینویسم.
پاسخ ها
![user](/_ipx/f_webp&q_50&blur_3&s_10x10/codeyad/assets/img/UserAvatars/5048777e-423b-46c3-9968-a0ecc498e69d0955598345365.jpg)
bzmind
مثلا اگر کامند ما مربوط به اضافه کردن یک آدرس جدید برای یوزر باشه:
public record AddCustomerAddressCommand(string CustomerId, string City) : IBaseCommand;
public class AddCustomerAddressCommandHandler : IBaseCommandHandler<AddCustomerAddressCommand>
{
private readonly ICustomerRepository _customerRepository;
public AddCustomerAddressCommandHandler(ICustomerRepository customerRepository)
{
_customerRepository = customerRepository;
}
public async Task<OperationResult> Handle(AddCustomerAddressCommand request, CancellationToken cancellationToken)
{
var customer = await _customerRepository.GetAsTrackingAsync(request.CustomerId);
if (customer == null)
return OperationResult.NotFound();
customer.AddAddress(request.CustomerId, request.City);
await _customerRepository.SaveAsync();
return OperationResult.Success();
}
}
======================================================================================================================================
// Domain Layer
public class Customer
{
public List<CustomerAddress> Addresses { get; private set; }
public void AddAddress(long customerId, string city)
{
var address = new CustomerAddress(customerId, city);
Addresses.Add(address);
}
}
اینجا وظیفه ساختن آبجکت CustomerAddress باید به عهده همون CommandHandler باشه یا توی خود انتیتی Customer انجام شه؟
و بعد مثلا متود AddAddress دیگه مستقیم یه شی CustomerAddress میگیره بجای اینکه آیدی بگیره و خودش آبجکتو بسازه:
public void AddAddress(CustomerAddress address)
{
Addresses.Add(address);
}
یا کلا اصلا فرقی نداره کجا باشه؟
![user](/_ipx/f_webp&q_50&blur_3&s_10x10/codeyad/assets/img/UserAvatars/50655e66-86e5-4e25-9c29-7f4f3980c193.jpg)
محمد اشرافی
سلام روش بهتر همون مثال اوله ، توی Aggregate روت نمونه سازی بشه بهتره
![user](/_ipx/f_webp&q_50&blur_3&s_10x10/codeyad/assets/img/UserAvatars/5048777e-423b-46c3-9968-a0ecc498e69d0955598345365.jpg)
bzmind
ممنون استاد.