当验证需要数据库时,BL vs DAL

本文关键字:BL vs DAL 数据库 验证 | 更新日期: 2023-09-27 18:15:20

我计划将验证逻辑放在业务逻辑层,其中可能包括以下内容:

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

当验证需要数据库时,BL vs DAL

你应该检查两遍。

一旦在BL中向用户显示一条正常消息,说他输入了一个已经存在的值。

第二次,你应该检查你的DAL,你不试图插入一个唯一的值(就像数据库中的unique约束),因为你不知道谁会使用它,在这种情况下抛出一个自定义异常,可以被使用你的DAL层的新用户理解。

你的问题模棱两可。这取决于你指的是哪一种记录和哪一种操作。

如果您引用一个对多个记录,如:

header --> many details

提单

则在BL中进行重复检查。也就是说,例如,验证标题的细节是否必须不包含两个或多个相同的项代码,等等。如果进程接受头数组,则在BL中也进行重复的头验证。

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

木豆

但是,当您想要验证头id是否已经存在于DB时,请在DAL中进行验证。这是因为BL不知道它在存储库中是什么。这是DAL的责任。

在某些情况下,你不需要先做验证,例如,如果头表已经有唯一的索引,它会抛出异常,你只需要抓住它。但是对于特定的DB验证检查,如:item不存在,item数量不够,特定的用户不存在,您必须在DAL中进行,或者使用存储过程进行。

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

我的观点是,过于保守的做法令人窒息。只在BL中执行重复检查,并通过dal调用带来整个对象列表。但是,如果对象列表太大,您可能必须在存储过程/DAL层

中进行重检。