我正在使用 NHibernate 作为我的 ORM 编写 ASP.NET MVC 应用程序。不过,我在设计方面遇到了一些困难,希望得到一些意见。
所以,我的问题是我的业务/验证逻辑应该放在哪里(例如,电子邮件地址需要 @,密码 >= 8 个字符等......)?
所以,这最有意义:
我想我主要关心的是对 NHibernate 使用的域对象进行所有验证。每次从数据库中提取对象时进行不必要的验证检查似乎效率很低。需要明确的是,我认为这是一个真正令人担忧的问题,因为该应用程序的要求非常高(想想某些表中的数百万行)。
更新: 我删除了一行有关 NHibernate 的错误信息。
澄清一些误解:
a) NHib 不要求您映射到属性。使用访问策略,您可以轻松映射到字段。如果您更喜欢使用属性或字段以外的其他内容,您还可以定义自己的自定义策略。
b)如果您确实映射到属性,则 getter 和 setter 不需要需要公开。它们可以受到保护甚至私有。
话虽如此,我完全同意当您从数据库检索实体时,域对象验证没有任何意义。因此,我会选择在用户尝试更新实体时验证数据的服务。
我目前的项目和你的一模一样。使用MVC作为前端,使用NHibernate作为持久化。目前,我的验证位于服务层(您的选项 2)。但是,当我进行编码时,我感觉我的代码并不像我希望的那么干净。例如
public class EntityService
{
public void SaveEntity(Entity entity)
{
if( entity.Propter1 == something )
{
throw new InvalidDataException();
}
if( entity.Propter2 == somethingElse )
{
throw new InvalidDataException();
}
...
}
}
这让我感觉EntityService是一个“神类”。它对实体类了解太多,我不喜欢它。对我来说,让实体类自己担心感觉要好得多。但我也理解您对 NHibernate 性能问题的担忧。因此,我的建议是在 Setters 中实现验证逻辑,并使用字段进行 NHibernate 映射。