NHibernate 损害域对象

问题描述 投票:0回答:2

我正在使用 NHibernate 作为我的 ORM 编写 ASP.NET MVC 应用程序。不过,我在设计方面遇到了一些困难,希望得到一些意见。

所以,我的问题是我的业务/验证逻辑应该放在哪里(例如,电子邮件地址需要 @,密码 >= 8 个字符等......)?

所以,这最有意义:

  1. 将其放在域对象本身上,可能放在属性设置器中?
  2. 在我的域层之上引入一个服务层,并为其中的每个域对象提供验证器?
  3. 维护两组域对象。一套用于 NHibernate,另一套智能套用于业务逻辑(以及它们之间的某种适应层)。

我想我主要关心的是对 NHibernate 使用的域对象进行所有验证。每次从数据库中提取对象时进行不必要的验证检查似乎效率很低。需要明确的是,我认为这是一个真正令人担忧的问题,因为该应用程序的要求非常高(想想某些表中的数百万行)。

更新: 我删除了一行有关 NHibernate 的错误信息。

asp.net asp.net-mvc nhibernate oop
2个回答
1
投票

澄清一些误解:

a) NHib 要求您映射到属性。使用访问策略,您可以轻松映射到字段。如果您更喜欢使用属性或字段以外的其他内容,您还可以定义自己的自定义策略。

b)如果您确实映射到属性,则 getter 和 setter 不需要需要公开。它们可以受到保护甚至私有。

话虽如此,我完全同意当您从数据库检索实体时,域对象验证没有任何意义。因此,我会选择在用户尝试更新实体时验证数据的服务。


0
投票

我目前的项目和你的一模一样。使用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 映射。

© www.soinside.com 2019 - 2024. All rights reserved.