在动态更改连接字符串时发出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。这可能会导致许多问题。改为使用有条件投标:
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());