Допустим есть у вас такой объект как заказ в интернет магазине, т.е. то что имеет некий workflow и меняет свое состояние со временем.
Каким образом осуществляется акутализация состояния объекта в процессе обработки ?
Например
public class Order
{
public int Id {get;}
public int Status {get;}
public DateTime PayDate {get;}
}
public interface IOrderOperation
{
bool Execute( Order task);
}
// ну и несколько обработчиков
public class ClientSendEmail : IOrderOperation {}
public class PayOrder : IOrderOperation {}
public class ReserveOrder : IOrderOperation{};
public class ShipOrder : IOrderOperation{};
var order = orderRepository.Get(id);
reserveOrder.Execute(order); // orderRepository.Reserve(id);
payOrder.Execute(order);
clientSender.Execute(order);
shipOrder.Execute(order);
Каким образом правильнее делать обновления состояния
— меняется статус
— меняется поле PayDate после payOrder.Execute
с обновлением статуса можно добавить метод у объекта Order — Reserve() который изменяет поле Status если сохранение в orderRepository.Reserve(id) прошло успешно. Но это не очень хороший вариант, т.к. этот метод можно дернуть и до сохранения в хранилище ничего этому не мешает. Да и в хранилище может что-то случится и статус не обновится.
с датой оплаты получается нужно
1. повторно считать объект из хранилища (т.е. межу payOrder и clientSender вставить снова order = orderRepository.Get(id)
2. процедура orderRepository.Pay(id) должна вернуть нам дату и по аналогии со статусом вызвать некий метод order.SetPayDate(orderDate) но это не очень нравится также как с Order.Reserve() получается мы можем передать туда любую дату , т.е можем нарушить целостность.
Получается два варианта
1. перед каждой операцией перечитывать объект из хранилища, но это снижает производительность.
2. каждая операция с хранилищем возвращает измененные данные , которые меняют состояние объекта путем установки свойств или через методы объекта, тут минус в том что получается легко программно изменить состояние объекта
или если еще варианты как это правильнее сделать без перечисленных недостатков ?
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов