开发者

Register multiple IInterceptor in nhibernate

开发者 https://www.devze.com 2023-03-16 17:51 出处:网络
Is there any way to register multiple IInterceptor in nhibernate this dose not work in hhibernate 3.1.0.4000

Is there any way to register multiple IInterceptor in nhibernate

this dose not work in hhibernate 3.1.0.4000

config.SetInterceptor(new ContextAware开发者_StackOverflow中文版Interceptor());
config.SetInterceptor(new ContextAwareCommandInterceptor());
config.SetInterceptor(new SqlInterceptor());


You can pull this off by using a composite interceptor. The following is an implementation that's worked for me. Just be aware that if you have multiple interceptors that implement a method that returns a value (Like GetEntity()), in some cases the first one is returned and others (Like FindDirty() and OnPrepareStatement()) the results are combined. Full listing with tests here.

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using MoreLinq;
using NHibernate;
using NHibernate.SqlCommand;
using NHibernate.Type;

public class CompositeInterceptor : IInterceptor
{
    private readonly IEnumerable<IInterceptor> _interceptors;

    public CompositeInterceptor(IEnumerable<IInterceptor> interceptors)
    {
        _interceptors = interceptors.ToList();
    }

    public void AfterTransactionBegin(ITransaction tx)
    {
        _interceptors.ForEach(x => x.AfterTransactionBegin(tx));
    }

    public void AfterTransactionCompletion(ITransaction tx)
    {
        _interceptors.ForEach(x => x.AfterTransactionCompletion(tx));
    }

    public void BeforeTransactionCompletion(ITransaction tx)
    {
        _interceptors.ForEach(x => x.BeforeTransactionCompletion(tx));
    }

    public int[] FindDirty(object entity, object id, object[] currentState, 
        object[] previousState, string[] propertyNames, IType[] types)
    {
        var results = _interceptors
            .Select(interceptor => interceptor.FindDirty(entity, id,
                currentState, previousState, propertyNames, types))
            .Where(result => result != null)
            .SelectMany(x => x)
            .Distinct()
            .ToArray();
        return !results.Any() ? null : results;
    }

    public object GetEntity(string entityName, object id)
    {
        return _interceptors
            .Select(interceptor => interceptor.GetEntity(entityName, id))
            .FirstOrDefault(result => result != null);
    }

    public string GetEntityName(object entity)
    {
        return _interceptors
            .Select(interceptor => interceptor.GetEntityName(entity))
            .FirstOrDefault(result => result != null);
    }

    public object Instantiate(string entityName, EntityMode entityMode, object id)
    {
        return _interceptors
            .Select(interceptor => interceptor.Instantiate(entityName, entityMode, id))
            .FirstOrDefault(result => result != null);
    }

    public bool? IsTransient(object entity)
    {
        return _interceptors
            .Select(interceptor => interceptor.IsTransient(entity))
            .FirstOrDefault(result => result != null);
    }

    public void OnCollectionRecreate(object collection, object key)
    {
        _interceptors.ForEach(x => x.OnCollectionRecreate(collection, key));
    }

    public void OnCollectionRemove(object collection, object key)
    {
        _interceptors.ForEach(x => x.OnCollectionRemove(collection, key));
    }

    public void OnCollectionUpdate(object collection, object key)
    {
        _interceptors.ForEach(x => x.OnCollectionUpdate(collection, key));
    }

    public void OnDelete(object entity, object id, object[] state, 
        string[] propertyNames, IType[] types)
    {
        _interceptors.ForEach(x => x.OnDelete(entity, id, state, propertyNames, types));
    }

    public bool OnFlushDirty(object entity, object id, object[] currentState, 
        object[] previousState, string[] propertyNames, IType[] types)
    {
        return _interceptors.Count(interceptor => interceptor.OnFlushDirty(
            entity, id, currentState, previousState, propertyNames, types)) > 0;
    }

    public bool OnLoad(object entity, object id, object[] state, 
        string[] propertyNames, IType[] types)
    {
        return _interceptors.Count(interceptor => interceptor.OnLoad(
            entity, id, state, propertyNames, types)) > 0;
    }

    public SqlString OnPrepareStatement(SqlString sql)
    {
        return _interceptors.Aggregate(sql, (current, interceptor) => 
            interceptor.OnPrepareStatement(current));
    }

    public bool OnSave(object entity, object id, object[] state, 
        string[] propertyNames, IType[] types)
    {
        return _interceptors.Count(interceptor => interceptor.OnSave(
            entity, id, state, propertyNames, types)) > 0;
    }

    public void PostFlush(ICollection entities)
    {
        _interceptors.ForEach(x => x.PostFlush(entities));
    }

    public void PreFlush(ICollection entities)
    {
        _interceptors.ForEach(x => x.PreFlush(entities));
    }

    public void SetSession(ISession session)
    {
        _interceptors.ForEach(x => x.SetSession(session));
    }
}


You can't. A session can only have one interceptor.

You should look into Events instead.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号