مکان ساختن آبجکت های لایه Domain موقع استفاده از CQRS

bzmind ‌
20 فروردين ۱۴۰۱

سلام

میخواستم بدونم ما وقتی میایم Command و CommandHandler هامونو میسازیم، بعد مثلا توی Command که به صورت record هست، میایم پارامتر هارو میگیریم از یوزر، حالا ما باید بیایم توی خود CommandHandler مثلا اون شی رو بسازیم و پاسش بدیم به لایه Domain یا مستقیم همون پارامتر ها رو پاس بدیم به لایه Domain بعد توی خود انتیتی، اون پارامتر هارو داخل یه متود بگیریم و ازش آبجکت مورد نیازمون رو بسازیم؟

یه مثال اگر تونستم توی پاسخ پایینی مینویسم.

654

3 پاسخ
  • bzmind ‌20 فروردين ۱۴۰۱

    مثلا اگر کامند ما مربوط به اضافه کردن یک آدرس جدید برای یوزر باشه:

    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);
    }

    یا کلا اصلا فرقی نداره کجا باشه؟

  • محمد اشرافی20 فروردين ۱۴۰۱

    سلام روش بهتر همون مثال اوله ، توی Aggregate روت نمونه سازی بشه بهتره

  • bzmind ‌20 فروردين ۱۴۰۱

    ممنون استاد.