Atomic Insert-or-Get и Compare-and-Update - нарушение репозитория?

Я использую шаблон репозитория как часть проекта С# 4 и MVC3, и я просто хочу убедиться, что я не делаю что-то плохое; либо это, либо просто мое архитектурное педантизм, немного увлекшись собой, и мне просто нужен образный пощечину:)

Для определенного типа модели мне нужно иметь возможность выполнять следующие две операции:

  • Создайте новый экземпляр в репозитории, пока другой не существует с определенным значением состояния
  • Обновить значение состояния экземпляра в репозитории, только если оно еще не находится в этом состоянии

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

Поскольку база данных будет исходной конечной точкой для репозитория, это может быть реализовано с транзакциями в нескольких хранимых процедурах. Однако это означает, что вместо методов Get/Insert/Update в моем интерфейсе репозитория мне нужна семантика Get_Or_Insert и Compare_And_Update, чтобы приложение могло ожидать атомарности из репозитория, а не принудительно выполнять его.

Мне действительно не удастся вернуть транзакцию к вызывающему коду, в частности потому, что я не могу гарантировать, что немедленный репозиторий будет БД, но может быть веб-службой (или другими вещами); и откровенно посредничающие транзакции через веб-сервисы, хотя я знаю, что это возможно, просто слишком тяжело (особенно с точки зрения реализации) для такой простой операции в моей книге!

Итак, могу ли я с радостью добавить эти специальные операции в репозиторий, или я неправильно следую шаблону?

1 ответ

за то, что стоит, позвольте мне предложить дружеский "образный пощечину по лицу":) помните, что шаблоны существуют, чтобы служить вам, а не наоборот. Если у вас есть обоснованная необходимость "согнуть" DP немного, я верю, что все в порядке. Особенно в свете того факта, что в настоящее время у вас нет лучшей идеи (и, кстати, я тоже).

licensed under cc by-sa 3.0 with attribution.