2010-07-14 2 views
1

Je vais bien this msdn article by noted DDD expert Udi Dahan, où il fait une grande observation qu'il a dit lui a pris des années à réaliser; "Ramener toutes les adresses e-mail dans la mémoire vous verrouillera probablement par la police des performances.Même si le modèle de domaine appelle un service, qui appelle la base de données, pour voir si l'adresse e-mail est là n'est pas nécessaire. dans la base de données suffirait. " Dans une présentation LOB qui a capturé un scénario d'ajout ou de modification, vous n'activez pas l'action Enregistrer le type tant que toutes les modifications n'ont pas été considérées comme valides. Le premier compromis à faire est donc que vous devez activer Enregistrer et modifier. préparé pour notifier l'utilisateur si la contrainte d'unicité est violée. Mais comment faire mieux, disons avec NHibernate? Je pense qu'il faut suivre les lignes du pseudo-code ci-dessous. Quelqu'un fait-il quelque chose dans ce sens maintenant?en utilisant le DB pour éviter les erreurs dans une présentation de l'interface utilisateur

Cheers,
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 
} 
+0

fyi il y a probablement une exception plus spécifique qui se produira lorsqu'une contrainte unique est brisée. –

Répondre

3

L'approche pessimiste est de vérifier-ness unique, avant d'enregistrer; l'approche optimiste consiste à tenter l'enregistrement et à gérer l'exception. Le plus gros problème avec l'approche optimiste est que vous devez être capable d'analyser l'exception renvoyée par la base de données pour savoir qu'il s'agit d'une violation de contrainte unique spécifique plutôt que la myriade d'autres choses qui peuvent mal tourner. Pour cette raison, il est beaucoup plus facile de vérifier l'unique avant de sauvegarder. C'est un appel de base de données trivial pour faire cette vérification: select 1 where email = '[email protected]'. C'est aussi une meilleure expérience utilisateur pour informer l'utilisateur que la valeur est un doublon (peut-être qu'ils sont déjà enregistrés sur le site?) Avant de les faire remplir le reste du formulaire et cliquer sur Enregistrer.

La contrainte unique doit absolument être en place, mais l'interface utilisateur doit vérifier que l'adresse est unique au moment de sa saisie dans le formulaire.

+0

Cela me rend fou de remplir un long formulaire d'inscription pour découvrir que demon $ layer69 est déjà pris. –

+0

Cela implique de faire cette vérification dans votre configurateur de propriétés Email juste avant que votre propriété change, si ce n'est pas un dup, et ajoutez une règle BRoken si c'est le cas. Doux – Berryl

+0

Donc * vous êtes * celui qui a pris mon démon $ layer69 $ :-) – Berryl

Questions connexes