2

ASP.NET MVC アプリで NHIbernate と共に IoC に Castle Windsor を使用しています。次のように登録するとうまく機能します。

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 を導入したいと考えています。通常、SessionFactory.OpenSession(...) は通常、コンポーネント登録中 (App_Start にある) の「並べ替え」ではなく、Begin_Request で呼び出されるため、後でインターセプターを簡単に渡すことができる NHibernate セッションマネージャーを使用しました。 )。残念ながら、その時点で 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 Interceptor (通常は SessionFactory.OpenSession(IInterceptor) に挿入されます) を導入する最良の方法は何でしょうか?

4

1 に答える 1

0

コメントに記載されているように、ラムダでインターセプターをインスタンス化するコードを配置する必要があります。このようにして、コードは適切なタイミングで実行されます。

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