Атомная вставка или получение и сравнение и обновление - нарушение репозитория? - PullRequest
0 голосов
/ 29 марта 2011

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 29 марта 2011

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

...