Я использую шаблон Repository как часть проекта C # 4 и MVC3, и я просто хочу убедиться, что я не делаю что-то плохое;Либо это, либо просто моя архитектурная педантичность немного увлекла себя, и мне просто нужен образный шлепок по лицу:)
Для конкретного типа модели мне необходимо выполнить следующие две операции:
- Создать новый экземпляр в хранилище , если другой экземпляр не существует с определенным значением состояния
- Обновить значение состояния экземпляра врепозиторий только если он еще не находится в этом состоянии
В обоих случаях крайне важно, чтобы операции были атомарными, поскольку они используются для принятия важных решений.
Поскольку база данных будет начальной конечной точкой для хранилища, это может быть реализовано с помощью транзакций в нескольких хранимых процедурах.Однако это означает, что вместо методов Get / Insert / Update в моем интерфейсе репозитория мне нужна семантика Get_Or_Insert
и Compare_And_Update
, чтобы приложение могло ожидать атомарность от репозитория, а не применять его сам.
На самом деле я не могу перенести транзакцию обратно в вызывающий код, в частности, потому что я не могу гарантировать, что немедленное хранилище будет БД, но может быть веб-службой (или другими вещами);и откровенно посреднические транзакции через веб-сервисы, хотя я знаю, что это возможно, просто слишком тяжело (особенно с точки зрения реализации) для такой простой операции в моей книге!
Итак, могу ли я с радостью добавить эти специальныеcase-операции в репозитории, или я неправильно следую шаблону?