использование базы данных для предотвращения ошибок в презентации пользовательского интерфейса - PullRequest
1 голос
/ 14 июля 2010

Я собираюсь эту статью MSDN известного эксперта DDD Уди Дахана , где он делает большое наблюдение, которое, как он сказал, потребовалось ему годы, чтобы понять; «Добавление всех адресов электронной почты в память, вероятно, приведет к тому, что полиция по производительности заблокирует вас. Даже если модель домена вызовет какую-либо службу, которая вызывает базу данных, чтобы выяснить, есть ли там адрес электронной почты, нет необходимости. Уникальное ограничение в базе данных будет достаточно. "

В презентации большого объекта, в которой описан некоторый сценарий добавления или редактирования, вы не включите действие Тип сохранения, пока все изменения не будут считаться действительными, поэтому первый компромисс, выполняющий вышеописанное, заключается в том, что вам нужно включить сохранение и подготовиться уведомить пользователя, если ограничение уникальности нарушено. Но как лучше всего это сделать, скажем, с помощью NHibernate?

Я полагаю, что он должен следовать строчкам псевдокода ниже. Кто-нибудь сейчас что-то делает в этом направлении?

Приветствия
Berryl

try {}
catch (GenericADOException)
{
    // "Abort due to constraint violation\r\ncolumn {0} is not unique", columnName)
    //(1) determine which db column violated uniqueness
    //(2) potentially map the column name to something in context to the user
    //(3) throw that can be translated into a BrokenRule for the UI presentation
    //(4) reset the nhibernate session
}

1 Ответ

3 голосов
/ 14 июля 2010

Пессимистический подход заключается в проверке уникальности перед сохранением; оптимистический подход заключается в попытке сохранить и обработать исключение. Самая большая проблема с оптимистическим подходом заключается в том, что вы должны иметь возможность анализировать исключение, возвращаемое базой данных, чтобы понять, что это конкретное уникальное нарушение ограничения, а не множество других вещей, которые могут пойти не так.

По этой причине гораздо проще проверить уникальность перед сохранением. Для этой проверки достаточно простого вызова базы данных: select 1 where email = 'newuser@somewhere.com'. Также удобнее уведомить пользователя о том, что значение является дубликатом (возможно, они уже зарегистрированы на сайте?), Прежде чем заставлять его заполнить оставшуюся часть формы и нажать «Сохранить».

Однозначно должно быть установлено уникальное ограничение, но пользовательский интерфейс должен проверять, является ли адрес уникальным в момент его ввода в форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...