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

سوال شده توسط: bzmind ‌

تاریخ ثبت: ۱۴۰۱/۰۱/۲۰

بازدید: 561

پاسخ: 3

تگ: Asp.net Core


سلام

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

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

پاسخ ها
user

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

محمد اشرافی

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

user

bzmind ‌

ممنون استاد.

برای ثبت پاسخ باید خود شوید

محبوب ترین مقالات