Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Castle Windsor/NHibernate/FactoryMethod并注册NHibernate EmptyInterceptor_Nhibernate_Castle Windsor - Fatal编程技术网

Castle Windsor/NHibernate/FactoryMethod并注册NHibernate EmptyInterceptor

Castle Windsor/NHibernate/FactoryMethod并注册NHibernate EmptyInterceptor,nhibernate,castle-windsor,Nhibernate,Castle Windsor,我在ASP.NET MVC应用程序中使用Castle Windsor和NHIbernate作为我的IoC。它的工作原理如下: container.Register(Component.For<ISessionFactoryBuilder.().ImplementedBy<SessionFactoryBuilder>().LifestyleSingleton()); // Register the NHibernate session factory as a singleto

我在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()); 
container.Register(Component.For k.Resolve().BuildSessionFactory(“ApplicationServices”)).LifestyleSingleton();
container.Register(Component.For().UsingFactoryMethod(k=>k.Resolve().OpenSession()).LifestylePerWebRequest());
然而,我想介绍一个NHibernate IInterceptor,以便提供简单的审计。通常,我使用了NHibernate会话管理器,在该管理器中,稍后很容易传入拦截器,因为SessionFactory.OpenSession(…)通常会在Begin_请求中调用,而不是在组件注册期间(在App_Start中)调用“排序”。不幸的是,此时无法访问Lifestyle PerWebRequest模块,因此,对于,也就是说,以下失败是可以理解的:

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()); 
container.Register(Component.For().ImplementedBy().LifestylePerWebRequest());
var interceptor=container.Resolve();
container.Register(Component.For().UsingFactoryMethod(k=>k.Resolve().OpenSession(interceptor)).LifestylePerWebRequest());

引入NHibernate拦截器(通常插入SessionFactory.OpenSession(IIInterceptor))的最佳方式是什么当使用此方法对Castle Windsor进行NHibernate会话管理时?

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

container.Register(Component.For<ISession>()
                            .UsingFactoryMethod(k => k.Resolve<ISessionFactory>()
                               .OpenSession(container.Resolve<IInterceptor>()))
                            .Lif‌​estylePerWebRequest()); 
container.Register(Component.For())
.UsingFactoryMethod(k=>k.Resolve()
.OpenSession(container.Resolve())
.Lif‌​estylePerWebRequest());

可能是一个(非常)愚蠢的注释,但是如果移动container.Resolve()的话,执行是否会延迟到正确的时间在lambda内部,代替OpenSession的interceptor参数?好吧,为什么我没有意识到!?谢谢。我在SessionBuilder中注入了我的IIinterceptor,并通过Configuration.SetInterceptor(_interceptor)将其添加到我的NHibernate配置中,从而使其正常工作;但是,通过container.Register(Component.For().UsingFactoryMethod(k=>k.Resolve().OpenSession(container.Resolve())).LifestylePerWebRequest()将其放入通常的位置是很好的;将您的输入作为答案,我会将其标记为答案。然而,我遇到了另一个同样的问题,我应该将其作为单独的问题,但因为我的ChangeAuditerCeptor反过来使用了依赖于NHibernate会话的服务(以获取用户信息),我获得周期性依赖项:尝试解析组件“后期绑定的NHibernate.iseSession”时检测到依赖项循环。导致该循环的解析树如下:组件“后期绑定的NHibernate.iseSession”解析为组件“Blah…AccountSession”的依赖项,解析为组件“Blah.Core.inf”的依赖项AsStructure.Data.ChangeAuditInfoInterceptor'解析为组件的依赖项'Blah…SessionFactoryBuilder'解析为组件的依赖项'Late bound NHibernate.ISessionFactory'解析为根组件…NHibernate.ISession'的依赖项。您应该发布另一个问题,添加拦截器的代码以及所有相关代码。这是一个有趣的问题。我会对答案感兴趣。这似乎很有趣,但我不知道它将如何实现: