Мне необходимо, чтобы клиентское приложение "заблокировало" (или "извлекало") определенные бизнес-объекты, хранящиеся в базе данных.
Рабочий процесс таков:
Пользователь переходит на страницу для какого-либо бизнес-объекта.
Пользователь нажимает кнопку "изменить".
Это блокирует элементот редактирования кем-либо еще.
Другие пользователи на других рабочих станциях увидят небольшую иконку «блокировки» при редактировании элемента, а кнопка «редактировать» будет доступна только для чтения.
Пользователи-администраторы могут нажать кнопку, чтобы «принудительно» разблокировать элемент.
Довольно стандартно, верно? Я сделал это кучейВ прошлые времена, и я ищу некоторые мысли о «правильном» способе сделать это на этот раз ...
А именно, я предполагаю, что есть два подхода:
Пусть мои бизнес-объекты реализуют некоторый интерфейс ILockable, который имеет свойство LockOwnerId и имеет соответствующую таблицу в БД.a тот же LockOwnerId.
Наличие в БД централизованной таблицы «EntityLocks», которая управляет всеми парами сущностей / первичных ключей, которые в настоящее время заблокированы / извлечены.
Что касается API для получения блокировки, я просто думаю о чем-то вроде метода CheckOut:
// Returns true if the check-out was successful,
// false if the check-out was not successful, becase the item was already locked. If
// force is set to true, will check out the toCheckOut to the current user, regardless
// of existing check-outs.
bool CheckOut(object toCheckOut, bool force)
Мысли?
Спасибо.