2012-02-09 19 views
1

在連接字符串中,我應該通過使用連接字符串中的屬性application name = userid動態傳遞loggeduserid值,並使用query select app_name()進入SQL Server。使用問題動態更改連接字符串時重新綁定NInject

技術: 1).NET 4.0 2)NHibernate的 3)Ninject

之前登錄的我使用Ninject IoC容器和NHibernate加載連接字符串,而不應用程序的名稱屬性和登錄後,在我傳遞的登錄用戶ID爲構造函數值,並重新綁定NhibernateConfiguration類是在注入如下

已記錄之前,NHibernateConfiguration

public override void Load() 
     { 
      Bind<ISession>().ToMethod(x => x.Kernel.Get<NHibernateConfiguration>() 
               .GetSessionFactory() 
               .OpenSession()); 

      Bind<ISessionFactory>().ToMethod(x => x.Kernel.Get<NHibernateConfiguration>().GetSessionFactory()); 

     } 

登錄後傳遞具有構造函數參數的loggeduserid如下所示。

using (var kernal = ServiceLocator.GetKernel()) 
{ 
kernal.Rebind<NHibernateConfiguration>().To<NHibernateConfiguration>() 
.WithConstructorArgument("loggedUserId", user.Id); 
} 

但我不能重新綁定或注入NHibernateConfiguration類。

請幫助我如何使用Ninject

+0

您還沒有真正在所有綁定NHibernateConfiguration(你需要調用.Bind後,才能調用.Rebind),還對阿里納斯,Ninject心不是一個真正的服務定位器,即使它可以作爲一個,通常ninject被用於構造函數/參數注入場景中 – 2012-02-09 11:12:10

回答

1

不要使用你的應用程序的執行過程中重新綁定重新綁定NHibernateConfiguration類。這可能會導致很多問題。改爲使用條件投標:

kernel.Bind<NHibernateConfiguration>().To<NHibernateConfiguration>(); 
kernel.Bind<NHibernateConfiguration>().To<NHibernateConfiguration>() 
     .When(ctx => IsLoggedIn()) 
     .WithConstructorArgument("loggedUserId", request => user.Id); 

private bool IsLoggedIn() 
{ 
    // add code to decide if the user is logged in 
} 

此外,您的會話綁定沒有多大意義。它應該得到會話工廠。

Bind<ISession>().ToMethod(x => x.Kernel.Get<ISessionFactory>() 
       .OpenSession()); 
在你的榜樣