Правильный способ сохранения изменений в потомках Aggregate root - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть данный aggregateRoot:

 public class Room : Entity
{
    public Room()
    {
        RoomRates = new HashSet<RoomRate>();
    }


    public string Name { get; set; }

    public ICollection<RoomRate> RoomRates { get; }

    public int HotelId { get; set; }

    public void AddRoomRate(DateRange period, Money price)
    {

       RecalculateRates(period);

       RoomRates.Add(new RoomRate{Period = period, Price = price, RoomId = Id});

    }

Дочерний элемент:

public class RoomRate : Entity
{

    public DateRange Period { get; set; }

    public Money Price { get; set; }

    public int RoomId { get; set; }

    public void SetStart(DateTime start) {
        Period = new DateRange(start, Period.End);

    }

    public void SetEnd(DateTime end)
    {
        Period = new DateRange(Period.Start, end);

    }


}

Метод RecalculateRates может добавлять или изменять дочерние элементы:

foreach (var rateToReArrange in ratesToReArrange)
        {
            var periodToReArrange = rateToReArrange.Period;

            if (periodToReArrange.Contains(ratePeriod))
            {
                RoomRates.Add(new RoomRate
                {
                    Period = new DateRange(periodToReArrange.Start, dayBeforePeriodStarts),
                    Price = rateToReArrange.Price, RoomId = rateToReArrange.RoomId
                });



                rateToReArrange.SetStart(dayAfterPeriodEnds); 

                return;


            }

            if (rateToReArrange.Period.StartsInRange(ratePeriod))
            {
                rateToReArrange.SetStart(dayAfterPeriodEnds); 

                return;
            }

            if (rateToReArrange.Period.EndsInRange(ratePeriod))
            {
                rateToReArrange.SetEnd(dayBeforePeriodStarts);

                return;
            }
        }

После добавления дочерних элементовПересчитать я хочу сохранить корень:

room.AddRoomRate(new DateRange(request.Start,request.End), new Money(request.Amount, request.Currency.ToString()));

        _context.Rooms.Update(room);

        await _context.SaveChangesAsync(cancellationToken);

Я не могу обновить сущность, потому что есть новые дочерние элементы.Как сохранить изменения в корне?

Я использую CQRS и пытаюсь добавить новую ставку в команду.Должен ли я создать хранилище?

1 Ответ

0 голосов
/ 16 декабря 2018

Для каждого агрегата должен быть репозиторий, поэтому у вас должен быть репозиторий помещений.

Но шаблон репозитория является абстракцией коллекции объектов, у вас нет метода обновления, просто добавьте, удалить и получить.

Чтобы обновить объект, вы просто получаете его из хранилища и изменяете его.

Это механизм сохранения, реализующий хранилище, который будет следить за изменениями, внесенными вобъект (включая дочерние элементы корня), обертывающий их в транзакцию и выполняющий фиксацию для сохранения их в БД.

См. http://codebetter.com/iancooper/2011/04/12/repository-saveupdate-is-a-smell/

Надеюсь, это поможет.

...