Бизнес-модель блокировки - PullRequest
       21

Бизнес-модель блокировки

1 голос
/ 16 августа 2010

Мне необходимо, чтобы клиентское приложение "заблокировало" (или "извлекало") определенные бизнес-объекты, хранящиеся в базе данных.

Рабочий процесс таков:

  1. Пользователь переходит на страницу для какого-либо бизнес-объекта.

  2. Пользователь нажимает кнопку "изменить".

  3. Это блокирует элементот редактирования кем-либо еще.

  4. Другие пользователи на других рабочих станциях увидят небольшую иконку «блокировки» при редактировании элемента, а кнопка «редактировать» будет доступна только для чтения.

  5. Пользователи-администраторы могут нажать кнопку, чтобы «принудительно» разблокировать элемент.

Довольно стандартно, верно? Я сделал это кучейВ прошлые времена, и я ищу некоторые мысли о «правильном» способе сделать это на этот раз ...

А именно, я предполагаю, что есть два подхода:

  1. Пусть мои бизнес-объекты реализуют некоторый интерфейс ILockable, который имеет свойство LockOwnerId и имеет соответствующую таблицу в БД.a тот же LockOwnerId.

  2. Наличие в БД централизованной таблицы «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)

Мысли?

Спасибо.

1 Ответ

1 голос
/ 16 августа 2010

Лично я обычно стараюсь держаться подальше от этого паттерна, запрашивая изменения бизнес-процессов.Это, однако, не всегда возможно, и по этой причине Мартин Фаулер назвал это фактическим шаблоном. .

Решение, которое вы описали, звучит хорошо.Однако я предпочитаю, чтобы метод CheckOut вызывал исключение, за исключением возврата bool.Это гораздо более явно.Когда разработчики забудут обработать этот исключительный случай (элемент не может быть извлечен), ошибку будет намного легче обнаружить (поскольку исключение не обнаружено).

Также, пожалуйста, позаботьтесь о реализации.CheckOut метода.Убедитесь, что это транзакция.Последнее, что вам нужно, это возможность того, что два пользователя оба получили блокировку на одном и том же объекте, потому что реализация не реализована правильно.

Удачи.

...