【发布时间】:2010-11-26 12:53:46
【问题描述】:
我一直在阅读 Pro ASP.NET MVC Framework,Steven Sanderson,在第 11 章中讨论了数据验证。
在第 390 页,我们看到了将验证逻辑移动到您的模型层部分。在本节中,我们在第 392 页看到了一些代码,展示了如何实现验证。
代码实现了GetRuleViolations() 方法,Save() 方法使用它在出现问题时抛出RuleException。
然而,在我看来,领域层和数据访问层之间没有区别,代码如下:
public void Save() {
var errors = GetRuleViolations();
if (errors.Count > 0)
throw new RuleException(errors);
// Todo: Now actually save to the database or whatever
}
private NameValueCollection GetRuleViolations() {
// validations...
}
在我正在工作的一个项目中,我有一个 Domain 层,尽可能地忽略持久性,还有一个 Data Access 层,通过 NHibernate 实现数据访问,并实现在域层中定义接口的存储库。
如果我按照作者在此处建议的方式实施验证规则,在“Save()”方法上,它们将继续我的数据访问层,尽管至少我认为它们应该驻留在域模型上!
所以,我的问题是:在创建分层应用程序时,域层实现域实体并将接口暴露给存储库( persistence ignorant),数据访问层从域层实现存储库并实现所有数据访问代码,验证规则应该驻留在哪里 ?
我的主要(或至少第一个)界面将是一个 ASP.NET MVC 应用程序,如果这可能会改变的话。
谢谢。
【问题讨论】:
-
实际上我有两个不同的想法在我的脑海中争斗:(1)如果我决定写一个新的 DAL,我不想重写所有相同的规则(DRY)——以避免错过一条规则,或产生错误,或必须多次重新实施所有新规则; (2) 很难在域上实现“上下文验证”(因为我每次处理它时都必须在域上注入有关上下文的详细信息)......
标签: asp.net-mvc validation dns data-access-layer