代码之家  ›  专栏  ›  技术社区  ›  reustmd

NHibernate折衷域对象

  •  0
  • reustmd  · 技术社区  · 15 年前

    我正在使用NHibernate作为我的ORM编写一个ASP.NETMVC应用程序。虽然我在设计上有点困难,但我还是希望得到一些意见。

    那么,最有意义的是:

    1. 把它放在域对象本身上,可能放在属性设置器中?

    我想我主要关心的是将所有验证放在NHibernate使用的域对象上。每次从数据库中取出对象时都进行不必要的验证检查,这似乎效率低下。说清楚一点,我认为这是一个真正的问题,因为这个应用程序的要求非常高(想想某些表中的数百万行)。

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   John Rayner    15 年前

    为了澄清一些误解:

    a) NHib有 access strategies 您可以轻松地映射到字段。如果您喜欢使用属性或字段以外的内容,还可以定义自己的自定义策略。

    b) 如果您映射到属性,那么getter和setter就映射到属性 需要公开。它们可以受到保护,甚至是保密的。

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

        2
  •  0
  •   Wei Ma    15 年前

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