candland

@candland rss self
January 10th 2010

Making Sure A NHibernate IInterceptor Is In The Session

Building on the previous post Intercepting NHibernate to Handle Additional Database Work, I used the ILifecycle interface to ensure the IInterceptor was setup on the session before saving MyEntity. I ILifecycle interface is deprecated, but I needed some way to make sure the interceptor was there. If an entity has the ILifecycle interface nothing more is needed, NHibernate will call the methods. I used the OnSave method, to inspect the session instance and throw and exception if needed. Anyway, here’s the code:

public class MyEntity : ILifecycle

{

    public virtual int Id { get; set; }

    public virtual int ParentId { get; set; }

 

    public virtual LifecycleVeto OnSave(ISession s)

    {

        var sessionDelegate = s as SessionDelegate;

        var session = sessionDelegate != null ? sessionDelegate.InnerSession as SessionImpl : s as SessionImpl;

 

        if (session != null && session.Interceptor.GetType().Equals(typeof(MyEntityInterceptor)))

            return LifecycleVeto.NoVeto;

 

        throw new ApplicationException("MyEntityInterceptor needs to be registered with the container.");

    }

 

    public virtual LifecycleVeto OnUpdate(ISession s)

    {

        return LifecycleVeto.NoVeto;

    }

 

    public virtual LifecycleVeto OnDelete(ISession s)

    {

        return LifecycleVeto.NoVeto;

    }

 

    public virtual void OnLoad(ISession s, object id)

    {

    }

}

I think there are potentially better ways to handle this, but with the existing constraints on the code and time work something out, this was the way I went.

blog comments powered by Disqus