将NHibernate集合过滤器与DDD集合一起使用

时间:2009-10-12 08:52:05

标签: nhibernate collections domain-driven-design nhibernate-collections

我正在尝试在NHibernate中映射域模型。域模型是用我认为的DDD风格实现的。映射主要起作用,但是当我尝试在集合上使用集合过滤器时,我得到一个异常,其中说:该集合未被引用。

我知道问题来自于我如何实现该集合。我的问题:是否可以在nHibernate中使用以这种方式实现的集合中的集合过滤器,或者我应该忘记它,即nHibernate无法使用它。

代码如下:

Person
{
   IList<Address> _addresses = new List<Address>();
   public string FirstName {get; set;}
   ...
   public void addAddress(Address address)
   {
      // ... do some checks or validation
      _addresses.Add(address);
   }

   public void removeAddress(Address address) {...}

   public ReadOnlyCollection<Address> Addresses 
   { 
      get { return new ReadOnlyCollection<Address>(_addresses); }
   }
}

主要问题是我不想公开公开内部地址集合。 其他所有工作都有效,我使用field.camelcase-underscore访问,因此nHibernate直接与字段交互。我一直在研究Hibernate in Action一书,现在我在第7章处理集合过滤器。

有没有办法解决这个问题。我通过公开这样的内部集合来实现它:

public ReadOnlyCollection<Address> Addresses 
{ 
   get { return _addresses; }
}

但我真的不想这样做。

真的很感激帮助。

吉德

1 个答案:

答案 0 :(得分:0)

如果我没记错的话 - NHibernate过滤器在sql查询中用作附加子句,以减少从db返回的行。

我的问题是 - 你为什么需要那个? 我的意思是 - 一个人可能有多少地址? 1? 5? 10?


关于收集隔离......

我自己只是接受它作为NHibernate的牺牲(就像没有参数的ctor和“虚拟”)并且在任何地方使用暴露的IList(使用私人设置器)只是为了降低技术复杂性。他们的内容肯定可以从外面修改,但我不这样做。

保持代码易于理解比使其超级安全更重要。安全随之而来。