将NHibernate收集筛选器与DDD收集一起使用

将NHibernate收集筛选器与DDD收集一起使用,nhibernate,collections,domain-driven-design,nhibernate-collections,Nhibernate,Collections,Domain Driven Design,Nhibernate Collections,我试图在NHibernate中映射一个域模型。域模型是用DDD风格实现的。映射基本上是有效的,但是当我尝试在集合上使用集合过滤器时,我得到一个异常,它说:集合未被引用 我知道问题来自于我如何实现集合。我的问题:是否可以在nHibernate中对以这种方式实现的集合使用集合过滤器,或者我应该忘记它,即nHibernate无法处理此问题 代码如下: Person { IList<Address> _addresses = new List<Address>();

我试图在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); }
   }
}
人
{
IList_地址=新列表();
公共字符串名{get;set;}
...
公共无效地址(地址)
{
//…进行一些检查或验证
_地址。添加(地址);
}
公共无效删除地址(地址){…}
公共只读集合地址
{ 
获取{返回新的只读集合(_地址);}
}
}
主要问题是我不想公开内部地址集合。 其他一切都有效,我使用field.camelcase-underline访问,因此nHibernate直接与字段交互。我一直在阅读《Hibernate in Action》一书,现在我将在第7章中介绍集合过滤器

这有什么办法吗。我通过如下方式公开内部集合来实现这一点:

public ReadOnlyCollection<Address> Addresses 
{ 
   get { return _addresses; }
}
公共只读集合地址
{ 
获取{返回_地址;}
}
但我真的不想这么做

非常感谢您的帮助


Jide

如果我没记错的话-NHibernate筛选器作为sql查询中的附加子句工作,以减少从db返回的行

我的问题是-你为什么需要这个 我是说,一个人可能有多少地址?1.5.十点


关于集合隔离

我自己只是接受它作为NHibernate的牺牲(就像无参数的ctor和“虚拟性”),并在任何地方使用暴露的IList(与私有setter一起),只是为了降低技术复杂性。他们的内容当然可以从外面修改,但我就是不这么做


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

如果我没记错的话-NHibernate筛选器作为sql查询中的附加子句来减少数据库返回的行

我的问题是-你为什么需要这个 我是说,一个人可能有多少地址?1.5.十点


关于集合隔离

我自己只是接受它作为NHibernate的牺牲(就像无参数的ctor和“虚拟性”),并在任何地方使用暴露的IList(与私有setter一起),只是为了降低技术复杂性。他们的内容当然可以从外面修改,但我就是不这么做


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

如果您公开IList,如何处理消费者直接修改集合?我的理解是,最好创建一个助手方法来处理双向关系。@Mike我不处理这个问题。这就是我所说的牺牲。我只是为了不做那件事而编造惯例。如果你不能控制消费者,这可能不起作用(对我来说很容易——我的项目中甚至没有团队,我一个人)。处理双向关系的helper方法是什么意思?@Mike你会如何处理反射和修改私有集合的混乱哈哈,说得好。我可能会发出某种警告,这样如果有人这么做,我就可以打他的头。如果你暴露了IList,你如何处理消费者直接修改收藏?我的理解是,最好创建一个助手方法来处理双向关系。@Mike我不处理这个问题。这就是我所说的牺牲。我只是为了不做那件事而编造惯例。如果你不能控制消费者,这可能不起作用(对我来说很容易——我的项目中甚至没有团队,我一个人)。处理双向关系的helper方法是什么意思?@Mike你会如何处理反射和修改私有集合的混乱哈哈,说得好。我可能会放点警觉,这样如果有人这么做的话,我就可以打他的头。