我要去this msdn article by noted DDD expert Udi Dahan,在那里他做了很好的观察,他说他花了很多年才意识到; “将所有电子邮件地址带入内存可能会让你被性能警察锁定。甚至让域模型调用一些调用数据库的服务来查看电子邮件地址是否存在是不必要的。一个独特的约束在数据库中就足够了。“
在捕获一些添加或编辑方案的LOB演示文稿中,在所有编辑被认为有效之前,您不会启用“保存类型”操作,因此执行上述操作的第一个权衡是您需要启用“保存”并做好准备通知用户是否违反了唯一性约束。但是如何最好地做到这一点,比如说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
}
答案 0 :(得分:3)
悲观的方法是在保存之前检查独特性;乐观的方法是尝试保存并处理异常。乐观方法的最大问题是你必须能够解析数据库返回的异常,才能知道它是一个特定的唯一约束违规,而不是其他可能出错的其他东西。
出于这个原因,在保存之前检查唯一性更容易。这是一个简单的数据库调用来进行此检查:select 1 where email = 'newuser@somewhere.com'
。在填写表单的其余部分并单击“保存”之前,通知用户该值是重复的(可能已经在网站上注册了?)也是一种更好的用户体验。
唯一的约束应该确实存在,但是UI应该在表单上输入时检查地址是否唯一。