我正在尝试在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 :(得分:0)
如果我没记错的话 - NHibernate过滤器在sql查询中用作附加子句,以减少从db返回的行。
我的问题是 - 你为什么需要那个? 我的意思是 - 一个人可能有多少地址? 1? 5? 10?
关于收集隔离......
我自己只是接受它作为NHibernate的牺牲(就像没有参数的ctor和“虚拟”)并且在任何地方使用暴露的IList(使用私人设置器)只是为了降低技术复杂性。他们的内容肯定可以从外面修改,但我不这样做。
保持代码易于理解比使其超级安全更重要。安全随之而来。