我计划将验证逻辑放在业务逻辑层中,其中可能包括以下内容:
[Required], [Length > 0]
等。使用数据注释。但是,我还需要一个验证规则,在将 DAL 插入数据库之前检查对象是否不重复,例如[IsDuplicate]
. 所以,问题是,在哪里放置 [IsDuplicate] 验证规则?如果我把它放在我的 BL 中,那么这将违反我当前的 3 层设置,其中 BL 不知道 DAL。我想问题真的变成了,检查重复项是否被视为验证规则或其他内容?
我计划将验证逻辑放在业务逻辑层中,其中可能包括以下内容:
[Required], [Length > 0]
等。使用数据注释。但是,我还需要一个验证规则,在将 DAL 插入数据库之前检查对象是否不重复,例如[IsDuplicate]
. 所以,问题是,在哪里放置 [IsDuplicate] 验证规则?如果我把它放在我的 BL 中,那么这将违反我当前的 3 层设置,其中 BL 不知道 DAL。我想问题真的变成了,检查重复项是否被视为验证规则或其他内容?
你应该检查两次。
一旦在 BL 中向用户显示一条正常消息,说明他输入了一个已经存在的值。
第二次,您应该在 DAL 中检查您没有尝试插入唯一值(就像数据库中的 UNIQUE CONSTRAINT 一样),因为您不知道谁会使用它,在这种情况下抛出自定义使用您的 DAL 层的新人可以理解的异常。
我认为玩超安全是令人窒息的。仅在 BL 中进行重复检查,并通过 dal 调用获取整个对象列表。但是,如果对象列表太大,您可能必须在存储过程/DAL 层中进行重复检查
你的问题模棱两可。这取决于你指的是什么样的记录和什么样的操作。
如果您引用一对多记录,例如:
header --> many details
提单
然后在BL中进行重复检查。也就是说,例如,验证标头的详细信息是否不得包含两个或多个相同的项目代码等。如果该过程正在接受标头数组,则重复的标头验证也在BL中完成。
其他验证规则,如最小长度、字符串格式、空值等也在BL中完成。如果您使用一些约束和数据长度/ isnull 数据类型,它可以在DB中自动重新验证。
达尔
但是,当您想验证标头 id 是否已存在于DB中时,请在DAL中进行。那是因为BL不知道它在存储库中是什么。这是DAL的责任。
在某些情况下,您不需要先进行验证,例如,如果头表已经有唯一索引,它会抛出异常,您只需要捕获它。但是对于特定的数据库验证检查,例如:项目不存在,项目数量不够,特定用户不存在,您必须在DAL中进行,或使用存储过程。
但是,DAL中的任何验证都必须从BL调用,并避免从UI直接调用。