Существует проект, разработанный 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) поместите сохранение в веб-слой. Способ добавить ненужную нагрузку на пользовательский интерфейс и разрушить многоуровневую архитектуру.
код:
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();
}
}
так где же лучшее место для функции сохранения?