验证时BL与DAL需要DB

时间:2013-05-23 23:54:36

标签: c# architecture 3-tier

我打算将验证逻辑放在业务逻辑层中,其中包括:

[Required], [Length > 0]等。使用数据注释。但是,我还需要一个验证规则,在将DAL插入数据库之前检查该对象是否重复,例如, [IsDuplicate]。那么,问题是,在哪里放置[IsDuplicate]验证规则?如果我把它放在我的BL中,那么这将违反我当前的3层设置,其中BL不知道DAL。我想这个问题真的变成了,检查重复项是否被视为验证规则或其他什么?

3 个答案:

答案 0 :(得分:1)

你应该检查两次。

进入BL后,向用户显示正常消息,表示他已输入已存在的值。

第二次,您应该在DAL中检查您没有尝试插入唯一值(就像数据库中的UNIQUE CONSTRAINT一样)因为您不知道谁将使用它,在这种情况下抛出一个自定义异常,可以被使用你的DAL层的新人理解。

答案 1 :(得分:0)

我认为打超安全令人窒息。欺骗只检查BL并通过dal调用带来整个对象列表。但是,如果对象列表太大,您可能需要在存储过程/ DAL层中进行dupecheck

答案 2 :(得分:0)

你的问题很模糊。这取决于您所参考的记录类型和操作类型。

如果您参考一对多记录,例如:

header --> many details

<强> BL

然后在 BL 中完成复制检查。也就是说,例如,验证标头的详细信息是否必须包含两个或更多相同的项目代码等。如果进程正在接受标头数组,则重复的标头验证也在 BL 中完成

其他验证规则,如最小长度,字符串格式,空值等,也在 BL 中完成。如果使用某些约束和数据长度/ isnull数据类型,它可以在 DB 中自动重新验证。

<强> DAL

但是,如果要验证标题ID是否已存在于数据库中,请在 DAL 中进行验证。那是因为 BL 不知道它在存储库中是什么。这是 DAL 的责任。

在某些情况下,您不需要先进行验证,例如,如果标头表已经有唯一索引,它将抛出异常,您只需要捕获它。但是对于特定的 DB 验证检查,如:项目不存在,项目数量不足,特定用户不存在,您必须在 DAL 中执行,或使用存储过程为了它。

但是,必须从 BL 调用 DAL 中的任何验证,并避免从 UI 直接调用。