2

我在 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) 中的最佳方法是什么?

4

1 回答 1

0

如评论中所述,您应该将用于实例化拦截器的代码放在 lambda 中。这样,代码将在正确的时间执行:

container.Register(Component.For<ISession>()
                            .UsingFactoryMethod(k => k.Resolve<ISessionFactory>()
                               .OpenSession(container.Resolve<IInterceptor>()))
                            .Lif‌​estylePerWebRequest()); 
于 2013-08-19T15:29:49.060 回答