Мы разрабатываем приложение .Net со следующей архитектурой: уровень представления (с использованием шаблона MVC с ASP.Net MVC 2), уровень обслуживания, уровень доступа к данным (с использованием шаблона хранилища в Entity Framework).
Мы решили перевести управление транзакциями на уровень обслуживания, но не уверены, как его реализовать. Мы хотим полностью контролировать транзакцию на уровне сервисного уровня. То есть каждый раз, когда контроллер вызывает метод на уровне службы, он должен быть атомарной операцией в отношении обновлений базы данных.
Если бы не было связи между различными сервисами, предоставляемыми на уровне сервисов, то это было бы просто: каждый метод должен зафиксировать изменения в конце своего выполнения (то есть вызвать метод save в контексте, который он использует). Но иногда сервисы на уровне сервиса работают вместе.
например: мы предоставляем услугу отгрузки, которая имеет метод подтверждения, который получает следующие параметры: идентификатор отгрузки, флаг, указывающий, соответствует ли он новому или существующему клиенту, идентификатор клиента (в случае, если подтверждение отгрузки для существующего клиента) и имя клиента (в случае, если это для нового клиента). Если флаг установлен как «новый клиент», то сервисный уровень должен (а) создать клиента и (б) подтвердить отгрузку. Для (a) служба доставки вызывает службу поддержки клиентов (которая уже реализует проверки и логику, необходимые для создания нового клиента и сохранения его в базе данных).
Кто должен зафиксировать изменения в этом сценарии?
- Должна ли служба поддержки сделать это? он не может зафиксировать изменения после создания нового клиента, потому что позже в методе подтверждения отгрузки что-то может пойти не так, но он должен зафиксировать свои изменения в случае, если это вызов напрямую (в другом случае использования, предусмотренном для создания клиента).
- Должен ли контроллер, вызывающий метод service, делать это? но контроллер не должен ничего знать о транзакциях, мы решили поместить все знания транзакций на уровень обслуживания.
- Менеджер транзакций на уровне сервисов? Как это оформить? Кто это называет и когда?
Существует ли шаблон проектирования для этого, которому мы должны следовать?