2010-03-02 42 views
7

Business Objects的验证是一个常见问题,但有一些解决方案可以解决这个问题。业务对象或实体应该自我验证吗?

其中一种解决方案是使用独立的NHibernate.Validator框架,这是一个基于属性的验证框架。

但我正面临着概念关注。像NH.Validator这样的属性验证器非常棒,但验证只在会话中的save-update-delete时执行。

所以我想知道是否业务对象不应该自我验证,以保持自己的完整性和一致性?

回答

10

恕我直言 - 有2个步骤验证的是有效所需的业务对象(BO)/实体:

第一步:BO /实体自我验证 - 在此,我们只有在检查实体的状态是否有效F.Ex .:如果设置了邮政编码,那么它是否具有有效字符&具有有效长度等,以形成BO /实体等级验证。但是,除了这种验证级别之外,我们无法说BO/Entity在您的业务领域和/或存储库中是有效的。通常BO /实体将能够执行这种验证水平。

第二步:验证上下文 - 在这方面,我们需要验证,如果BO /实体是它被持久化存储库的范围内有效。例如:邮政编码是否对订单所在的国家/地区有效 对于此验证,可能需要涉及当前上下文中的一些或全部实体以确保BO /实体已验证。

因此,为了保持实体的纯净性,您需要将验证分为以下两个步骤 - 一个由实体本身执行&第二个由persistence /与实体一起工作的存储库执行。

HTH。

+0

这两个步骤的分离很有意思。虽然我从来没有真正想过这种方式,但是我在不知情的情况下部分使用这种方法。尽管如此,我还试图将自我验证与实体分开。我解释了我是如何在这里使用验证应用程序块执行此操作的:http://stackoverflow.com/questions/2258513/validation-framework-in-net-that-c​​an-do-edits-between-fields/2259062#2259062。 – Steven 2010-03-02 09:28:47

6

虽然他们并不总是可以自我验证。如果您输入“无效的”邮政编码怎么办?您可以验证邮政编码需要采用特定的格式,但如果您希望邮政编码“有效”,即“现有并匹配城市”,该怎么办?或者如果您只接受来自特定地区代码的电话号码,并且有效代码列表位于由法律部门维护的数据库中,该怎么办?

如果您可以执行语义验证,那很好,可以进入业务类。但是,通常情况下,您可能需要额外的验证,这些验证根本无法由业务类本身来处理,但需要由与数据库和其他外部服务进行交谈的类来处理。

+0

+1你说得对。在我的解释中,我谈论可以由实体进行自我检查的验证。 – Javier 2010-03-02 00:53:09

+2

我同意。我更愿意将我的验证逻辑与业务实体分开。 – Steven 2010-03-02 09:20:52

2

我不知道我们是否在谈论同样的想法,但如果我们是,我喜欢你的解释。很快,我会解释我做了什么来解决这个问题。在我的情况下,我的域图层中的所有商店对象必须覆盖两种方法:

很明显,为了保持这一点,我有更多的类受到牵连,但我不会在这里写所有,因为我只是试图解释概念

List<ValidationRule> notPassedValidationRules = new List<ValidationRule>(); 

//... 

public override void ValidateErrorsWhenSaving(Validator validator) 
{ 
    //... 
} 

public override void ValidateErrorsWhenDelete(Validator validator) 
{ 
    //... 
}   

在这些方法中,我检查了一些布尔条件,保留了一个未传递规则的集合。在我的情况下,这些方法在我的Unit Of Work提交更改(插入新实体,更新,删除)之前被调用,并在提交之前向用户显示可能的错误。

相关问题