在连接字符串中,我应该使用连接字符串中的属性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类
答案 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());