2012-02-09 78 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()); 
在你的榜样