Има проект, който е разработен от asp.net mvc 4 и entity framework 5. Архитектурата му е трислойна, има хранилище, услуга и потребителски интерфейс.
сега има проблем: къде се извиква функцията за запазване?
1) поставете записа в сервизния слой.
ако извикването на InventoryService.UpdateInventory е успешно, но genericRepository.unitOfWork.SaveChanges[2] е неуспешно, има несъответствие на данните.
код:
public class InventoryService
{
private GenericRepository _genericRepository;
public InventoryService(GenericRepository genericRepository){
_genericRepository = genericRepository;
}
public int UpdateInventory()
{
//...
_genericRepository.unitOfWork.SaveChanges(); //1
}
}
public class OrderService
{
private GenericRepository _genericRepository;
public OrderService(GenericRepository genericRepository){
_genericRepository = genericRepository;
}
public int UpdateOrder()
{
InventoryService.UpdateInventory();
//...
_genericRepository.unitOfWork.SaveChanges();//2
}
}
//note the _genericRepository is same.
2) добавете транзакция в услуга, ако някоя функция извика OrderService.UpdateOrder и съдържа също функция за запазване. така че трябва да добавим трансализация във функцията. има вложени транзакции, които генерират сериозен проблем с производителността.
код:
public class OrderService
{
private GenericRepository _genericRepository;
public OrderService(GenericRepository genericRepository){
_genericRepository = genericRepository;
}
public int UpdateOrder()
{
_genericRepository.unitOfWork.BeginTransaction();
try
{
InventoryService.UpdateInventory();
//...
_genericRepository.unitOfWork.SaveChanges();//2
_genericRepository.unitOfWork.CommitTransaction();
}
catch()
{
_genericRepository.unitOfWork..RollBackTransaction();
}
}
}
3) поставете записа в уеб слой. Начинът добавя ненужно задължение към потребителския интерфейс и унищожава n-слойната архитектура.
код:
public class InventoryService
{
private GenericRepository _genericRepository;
public InventoryService(GenericRepository genericRepository){
_genericRepository = genericRepository;
}
public int UpdateInventory()
{
//...
}
}
public class OrderService
{
private GenericRepository _genericRepository;
public OrderService(GenericRepository genericRepository){
_genericRepository = genericRepository;
}
public int UpdateOrder()
{
InventoryService.UpdateInventory();
//...
}
public void Save()
{
_genericRepository.unitOfWork.SaveChanges();
}
}
public class OrderController : Controller
{
public ActionResult update()
{
OrderService.UpdateOrder();
OrderService.Save();
}
}
така че къде е най-доброто място за функция за запазване?