2010-07-14 52 views
1

我正在通过this msdn article by noted DDD expert Udi Dahan,他在那里做了一个很棒的观察,他说他花了好几年才意识到; “将所有电子邮件地址存入内存可能会让你被性能警察锁定,即使域模型调用某个调用数据库的服务来查看电子邮件地址是否是不必要的。在数据库中就足够了。“使用db来防止UI演示文稿中的错误

在捕获一些添加或编辑场景的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

fyi当一个唯一的约束被破坏时,可能会出现一个更具体的异常。 – 2010-07-14 14:54:40

回答

3

悲观的方法是在保存前检查独特的烦躁;乐观的做法是尝试保存并处理异常。乐观方法的最大问题是,你必须能够解析数据库返回的异常,以便知道它是一个特定的唯一约束违规,而不是其他各种可能出错的事情。

由于这个原因,在保存之前检查独特性要容易得多。这是一个简单的数据库调用来做这个检查:select 1 where email = '[email protected]'。在让他们填写表单的其余部分并单击保存之前,通知用户该值是重复的(也许他们已经在网站上注册了?),这也是一种更好的用户体验。

独特的约束应该一定到位,但UI应该检查该地址在输入表单时是否是唯一的。

+0

它迫使我坚持填写一个长注册表单,以发现恶魔$ layer69已被占用。 – 2010-07-14 15:19:17

+0

这意味着在您的属性更改之前在您的Email属性设置器中执行该检查,如果不是dup,并且添加了BRoken规则(如果是)。甜心 – Berryl 2010-07-14 15:21:04

+0

所以*你是*一直在拿我的恶魔$ layer69 nick :-) – Berryl 2010-07-14 15:29:48