在动态更改连接字符串时发出Rebind NInject

本文关键字:Rebind NInject 字符串 动态 连接 | 更新日期: 2023-09-27 18:23:48

在连接字符串中,我应该使用连接字符串中的属性application name=userid动态传递loggeduserid值,并使用查询select app_name()进入SQL Server。

使用的技术:1) .net 4.02) NHibernate3) 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());
        }

登录后,通过带有构造函数参数的loggeuserid如下所示。

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

但我无法重新绑定或注入NHibernateConfiguration类。

请帮助我如何使用Ninject 重新绑定NHibernateConfiguration类

在动态更改连接字符串时发出Rebind NInject

在执行应用程序时不要使用rebind。这可能会导致许多问题。改为使用有条件投标:

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());