Хотя ответ Маурисио Шеффера чрезвычайно полезен, я решил дополнить его рабочим примером для реализации Interceptor для использования с NHibernate и Castle Active Records.
Перехватчик
using NHibernate;
using NHibernate.SqlCommand;
namespace Common.FTS
{
public class FtsHashInterceptor : EmptyInterceptor
{
private static FtsHashInterceptor instance = new FtsHashInterceptor();
protected FtsHashInterceptor() { }
public static FtsHashInterceptor Instance
{
get { return instance; }
set { instance = value; }
}
public override SqlString OnPrepareStatement(SqlString sql)
{
return sql.Replace("inner join Product fts1_", "inner hash join Product fts1_");
}
}
}
Подключение перехватчика с устройством
using Castle.ActiveRecord.Framework;
using Castle.Core.Configuration;
using Castle.MicroKernel;
using NHibernate;
namespace Common.FTS
{
///
/// Allows for the system to pick up the audit facility which will be used to
/// audit all transactions in the system.
///
public class FtsHashFacility : IFacility
{
#region IFacility Members
public void Init(IKernel kernel, IConfiguration facilityConfig)
{
InterceptorFactory.Create = new InterceptorFactory.CreateInterceptor(CreateFtsHashInterceptor);
}
public void Terminate()
{
// Nothing to terminate
}
#endregion
private IInterceptor CreateFtsHashInterceptor()
{
return FtsHashInterceptor.Instance;
}
}
}
Класс выше создает объект для активной записи. Мы связываем это в файле Global.asax.cs следующим образом:
static private IWindsorContainer _container;
protected void Application_Start(object sender, EventArgs e)
{
try
{
_container = new WindsorContainer(Server.MapPath("~/config/windsor.config"));
var app = _container.Resolve();
app.RegisterFacilities(_container);
app.RegisterComponents(_container);
}
}
В файле Application.cs мы добавляем средство следующим образом:
public void RegisterFacilities(IWindsorContainer container)
{
container.AddFacility("fts.support", new FtsHashFacility());
}
Заключение
Контейнер теперь содержит средство, которое подключит перехватчик Полнотекстовый поиск , который будет перехватывать все вызовы ActiveRecordMediator.
Мы не изменили строку кода в нашей существующей системе, но мы добавили возможность анализировать все наши операции SQL-запросов простым, но эффективным способом.
Особая благодарность Донну Фелкеру