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

C# 当验证需要数据库时,BL vs DAL,c#,architecture,3-tier,C#,Architecture,3 Tier,我计划将验证逻辑放在业务逻辑层中,其中可能包括以下内容: [必需],[Length>0]等,使用数据注释。但是,我还需要一个验证规则,在将DAL插入数据库之前检查对象是否重复,例如[IsDuplicate]。所以,问题是,将[IsDuplicate]验证规则放在哪里?如果我把它放在BL中,那么这将违反我当前的3层设置,BL不知道DAL。我想问题真的变成了,检查重复项被认为是验证规则还是其他什么?你应该检查两次 一旦进入BL,向用户显示一条正常消息,表示他输入了一个已经存在的值 第二次,您应该在D

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


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

你应该检查两次

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


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

我认为玩超级安全是令人窒息的。仅在BL中执行重复检查,并通过dal调用获取整个对象列表。但是,如果对象列表太大,您可能必须在存储过程/DAL层中执行dupecheck,您的问题是不明确的。这取决于您所指的记录类型和操作类型

如果您指的是一对多记录,如:

header --> many details
BL

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

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

DAL

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

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

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