2

我正在尝试在 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; }
}

但我真的不想这样做。

帮助真的很感激。

吉德

4

1 回答 1

0

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

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


关于集合隔离...

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

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

于 2011-03-12T23:17:30.780 回答