我在 ASP.NET MVC 应用程序中将 Castle Windsor 与 NHIbernate 一起用于我的 IoC。它工作得很好,注册如下:
container.Register(Component.For<ISessionFactoryBuilder.().ImplementedBy<SessionFactoryBuilder>().LifestyleSingleton());
// Register the NHibernate session factory as a singleton using custom SessionFactoryBuilder.BuildSessionFactory method.
container.Register(Component.For<ISessionFactory>().UsingFactoryMethod(k => k.Resolve<ISessionFactoryBuilder>().BuildSessionFactory("ApplicationServices")).LifestyleSingleton());
container.Register(Component.For<ISession>().UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession()).LifestylePerWebRequest());
但是,我想介绍一个 NHibernate IInterceptor 以提供简单的审计。通常,我使用 NHibernate 会话管理器,稍后在其中很容易传入拦截器,因为 SessionFactory.OpenSession(...) 通常会在 Begin_Request 中调用,而不是在组件注册期间的“排序”(在 App_Start )。不幸的是,此时无法访问 LifestylePerWebRequest 模块,因此,以下可以理解的失败:
container.Register(Component.For<IInterceptor>().ImplementedBy<ChangeAuditInfoInterceptor>().LifestylePerWebRequest());
var interceptor = container.Resolve<IInterceptor>();
container.Register(Component.For<ISession>().UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession(interceptor)).LifestylePerWebRequest());
在使用这种方法对 Castle Windsor 进行 NHibernate 会话管理时,引入 NHibernate 拦截器(通常插入到 SessionFactory.OpenSession(IInterceptor) 中的最佳方法是什么?