在动态更改连接字符串时发出重新绑定NInject

时间:2012-02-09 11:03:15

标签: c# .net ninject

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

使用的技术: 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重新绑定NHibernateConfiguration类

1 个答案:

答案 0 :(得分:1)

在执行应用程序期间不要使用重新绑定。这可能会导致许多问题。改为使用条件出价:

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