2

我想在NHibernate中映射域模型。领域模型是用我认为是DDD风格实现的。该映射工程主要是但当我尝试在集合上使用集合筛选器时,我得到一个异常,它说:集合未被引用。使用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; } 
} 

但我真的不想这样做。

帮助真的很感激。

积德

回答

0

如果我没有记错 - NHibernate的过滤器可以在SQL查询作为附加条款,以减少从数据库返回的行。

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


关于收集隔离...

我自己只是接受它作为NHibernate的(就像参数少构造函数的和“virtual`ity”)牺牲和到处使用暴露的IList(私人setter方法)只是为了减少技术的复杂性。他们的内容当然可以从外面修改,但我不这么做。

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

+0

如果您公开IList,您如何处理直接修改集合的消费者?我的理解是,最好的做法是创建一个辅助方法来执行此操作,以便处理双向关系。 – 2011-03-13 00:16:02

+0

@Mike我不处理。这就是我牺牲的意思。我只是在约定不这样做。如果你对消费者没有控制权,可能无法工作(对我来说容易 - 我的项目中甚至没有团队,我一个人也没有)。你用辅助方法处理双向关系是什么意思? – 2011-03-13 00:22:06

+0

@Mike你会如何处理与反射和修改私人收藏混乱? :) – 2011-03-13 00:24:32