Что касается N-уровневой архитектуры, где лучше всего хранить функцию сохранения?

Существует проект, разработанный 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();
    }
}

так где же лучшее место для функции сохранения?


person jun_eric    schedule 20.06.2014    source источник


Ответы (1)


Верхний слой/точка входа. Это единственное место, где теперь можно определить, какие вещи должны быть в одной и той же транзакции.

В этом случае действие контроллера MVC.

Если вы используете шаблон разделения команд/запросов, команда будет управлять транзакцией, поскольку каждая команда представляет вариант использования.

person jgauffin    schedule 20.06.2014
comment
Спасибо, jgauffin. Теперь я должен научиться разделять команды и запросы. потому что я новее, не мог подписать ваш ответ полезным, извините. - person jun_eric; 21.06.2014
comment
нет. Ответ, если вы не используете CQS, был In this case the MVC controller action - person jgauffin; 21.06.2014