Относно 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) поставете записа в уеб слой. Начинът добавя ненужно задължение към потребителския интерфейс и унищожава 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();
    }
}

така че къде е най-доброто място за функция за запазване?


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