Показать сообщение отдельно
Старый 23.01.2017, 13:27   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Поговорим о Unit Of Work?
наткнулся на
https://www.youtube.com/watch?v=cm64vkwzxl4
SMART TALKS: Dynamics AX мероприятие

что думаете о реализации класса UnitOfWork в Аксапте?
что думаете о реализации UnitOfWork по сравнению с InventSumDelta?


в комментариях к видео я написал:
паттерн Unit of Work: https://martinfowler.com/eaaCatalog/unitOfWork.html
полностью паттерн реализован в .net Entity Framework.
в аксапте достаточно ограниченная реализация.

основное преимущество не в многопоточной вставке, конечно.
основное преимущество в комбинации методов обновления и ЧТЕНИЯ (getByKey)
особенно когда записи обновляются несколько раз.

пример - inventTrans.costAdjustment обновляется каждый раз, когда происходит вставка в InventSettlement. по идее нужно делать inventTrans.update в базе каждый раз.
кроме того, есть InventSum, который нужно обновлять каждый раз как только изменяется/добавляется запись в InventTrans.

с Unit of work можно сделать алгоритм, который:
1. читает inventTrans из базы один раз.
2. обновляет в памяти
3. читает обновленную версию из памяти
4. в самом конце делает команду обновления в базу.
таким образом, сильно сокращается число обращений к базе. за счет этого и происходит оптимизация.

главная особенность:
getByKey читает запись из памяти, а если записи в памяти нет, то метод самостоятельно читает из базы.
за счет этого и достигается унификация алгоритма и щастье программиста.

особенности:
  • unit of work имеет смысл использовать в рамках одной транзакции
  • unit of work аксапты абсолютно не приспособлен для взаимодействия с bulk-операциями (хотя в .net этот паттерн взаимодействует с LINQ). unit of work в аксапте имеет смысл использовать в режиме "работа с отдельными записями".
  • unit of work в аксапте абсолютно не приспособлен для работы с формами. по сути каждая форма сама по себе "умный" unit of work.
  • в аксапте нет возможности управлять размером буфера unit of work. поэтому на огромных транзакциях типа закрытия склада класс unit of work может ухудшить ситуацию. Хотя именно для закрытия этот класс и создавался.

ну, и конечно Unit of Work в своем изначальном виде во внеаксаптовском мире часто используется как data source для unit test'ов.

Последний раз редактировалось mazzy; 23.01.2017 в 13:42.