NHibernate:恢复内部对象的事件

时间:2009-09-30 13:19:08

标签: nhibernate

假设我有

public class Parent
{
   private IList<Child> _children;
   public void AddChild(Child child)
   {
      _children.Add(child);
      child.OnSmthChanged += ParentSmthChangedHandler;
   }
   public void RemoveChild(Child child)
   {
      _children.Remove(child);
      child.OnSmthChanged -= ParentSmthChangedHandler;
   }
}
public class Child
{
   public event EventHandler OnSmthChanged;
}

当从数据库加载_children时,如何让NHibernate恢复事件?请注意:

  • 我不想在Child
  • 中使用Parent双向引用
  • _children是一个字段,因此我无法拦截其“set”
  • 我不喜欢使用OrderEvents.OrderChanged(order)等全局事件

所以,我考虑拦截NHibernate做_children的加载,并递归地添加事件。两个问题:

  1. 如何为_children加载执行此拦截操作?我猜,拦截所有集合加载将无效。小记:我使用Fluent NHibernate,所以具体建议会很好。
    • 像OnAfterObjectCreated(Parent)这样的东西不起作用,因为我无法访问私有字段。好吧,如果这是唯一的方法,我可以使用反射进行设置。
  2. 有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

你可以告诉nhibernate为_children字段使用observable collection:

<bag collection-type="uNhAddIns.WPF.Collections.Types.ObservableBagType`1[Your.Namespace.Child
, Your.Assembly.Name], uNhAddIns.WPF" ... />

然后:

public Parent()
{
   (_children as INotifyCollectionChanged).CollectionChanged += DoSomething;
}

public void DoSomething(object sender, NotifyCollectionChangedEventArgs e)
{
    if(e.Action == NotifyCollectionChangedAction.Add)
        foreach(var child in e.NewItems.Cast<Child>())
           child.OnSmthChanged += ParentSmthChangedHandler;

    if(e.Action == NotifyCollectionChangedAction.Remove)
        foreach(var child in e.OldItems.Cast<Child>())
           child.OnSmthChanged -= ParentSmthChangedHandler;
}

你可以找到here