【问题标题】:Using NHibernate Collection Filters with DDD collections将 NHibernate 集合过滤器与 DDD 集合一起使用
【发布时间】:2009-10-12 08:52:05
【问题描述】:

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

但我真的不想这样做。

非常感谢您的帮助。

吉德

【问题讨论】:

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


    【解决方案1】:

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

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


    关于集合隔离...

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

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

    【讨论】:

    • 如果你暴露一个IList,你如何处理消费者直接修改集合?我的理解是,最好创建一个辅助方法来执行此操作,以便处理双向关系。
    • @Mike 我不处理。这就是我所说的牺牲。我只是在编造约定不要那样做。如果您无法控制消费者,可能无法工作(对我来说很容易 - 我什至在我的项目中没有团队,我一个人)。处理双向关系的辅助方法是什么意思?
    • @Mike 你将如何处理反射和修改私人收藏的问题? :)
    • 大声笑,好点子。我可能会发出某种警报,这样如果有人这样做,我就可以打他们的头。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多