مکان ساختن آبجکت های لایه Domain موقع استفاده از CQRS
سلام
میخواستم بدونم ما وقتی میایم Command و CommandHandler هامونو میسازیم، بعد مثلا توی Command که به صورت record هست، میایم پارامتر هارو میگیریم از یوزر، حالا ما باید بیایم توی خود CommandHandler مثلا اون شی رو بسازیم و پاسش بدیم به لایه Domain یا مستقیم همون پارامتر ها رو پاس بدیم به لایه Domain بعد توی خود انتیتی، اون پارامتر هارو داخل یه متود بگیریم و ازش آبجکت مورد نیازمون رو بسازیم؟
یه مثال اگر تونستم توی پاسخ پایینی مینویسم.
پاسخ ها
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);
}
یا کلا اصلا فرقی نداره کجا باشه؟
محمد اشرافی
سلام روش بهتر همون مثال اوله ، توی Aggregate روت نمونه سازی بشه بهتره
bzmind
ممنون استاد.