Здравствуйте, itslave, Вы писали:
I>Здравствуйте, Sinix, Вы писали:
S>>Вариант 3: декремент через optimistic change tracking с обработкой неудачных попыток обновления.
I>Тут у чувака непонимание как обрабатывать конкурентное изменение данных, ты слишком глубоко копаешь
I>ИМХА только третий вариант поможет, остальные только усугубят
У меня не понятки как это сделать красиво с точки зрения архитектуры.
метод типа такого я могу написать
public void ChangeQuantity(int delta)
{
using(TransactionScope scope = new TransactionScope())
{
try{
//получаем текущее значение
// отнимаем дельту
// сохраняем то что получилось
scope.Complete()
}
catch(Exception){
scope.RollBack();
}
}
}
Мне нужен пример слабосвязанного кода, приведу пример.
например метод бизнес логики:
public class OrderProcessor: IOrderProcessor
{
......
public void ProcessOrder(int count)
{
//получаем продукт
....
product.NewQuantity = product.Quantity — count;
productRepository.Update(product);
}
}
public class Product{
.....
public int Quantity{get;set;}
public int NewQuantity{get;set;}
.......
}
//логика БД
DefaultProductREpository:IRepository<Product>
{
.....
public void Update(Product prod){
//открываем транзакцию
......
//получаем строку из таблицы, где хранится информация о количестве
var storageInfo = dbEntities.ProdStorageInfo.First(..... некое условие);
storInfo.Quantity = storInfo.Quantity — (product.Quantity — product.NewQuantity)
//работаем с другими данными для продукта которые хранятся в других таблицах
//сохраняем изменения закрываем транзакцию
....
}
....
}
Но такое решение наверное не очень красивое хотя бы потому,
что появляется дополнительное свойство у доменного объекта Product.