как солиднее будет
От: okon  
Дата: 19.02.16 23:56
Оценка: 19 (1)
Допустим есть у вас такой объект как заказ в интернет магазине, т.е. то что имеет некий 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. каждая операция с хранилищем возвращает измененные данные , которые меняют состояние объекта путем установки свойств или через методы объекта, тут минус в том что получается легко программно изменить состояние объекта

или если еще варианты как это правильнее сделать без перечисленных недостатков ?
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.