2012-02-09 9 views
1

接続文字列接続文字列で属性application name = useridを使用し、query select app_name()を使用してSQL Serverにアクセスすることによってloggeduserid値を動的に渡す必要があります。使用問題接続文字列を動的に変更しながらNInjectを再バインドする

技術: 1)4.0 2を.NET)NHibernateの 3)Ninject

ログイン中の前に、私は、アプリケーション名属性なしで接続文字列をロードするためにNinject IoCコンテナとNHibernateはを使用してログに記録された後にしていますNHibernateConfiguration

public override void Load() 
     { 
      Bind<ISession>().ToMethod(x => x.Kernel.Get<NHibernateConfiguration>() 
               .GetSessionFactory() 
               .OpenSession()); 

      Bind<ISessionFactory>().ToMethod(x => x.Kernel.Get<NHibernateConfiguration>().GetSessionFactory()); 

     } 
ジェクトにログインする前に

を次のように私は、コンストラクタ値としてログオンしているユーザーIDを渡すとNhibernateConfigurationクラスを再バインドしていています

ログイン後、constructor引数を指定してloggeduseridを渡すと、次のようになります。

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

しかし、NHibernateConfigurationクラスを再バインドまたは注入できません。

Ninject

+0

通常、コンストラクタ/パラメータ注入シナリオではninjectが使用されます –

答えて

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 
} 

また、セッションバインドはあまり意味がありません。代わりにセッションファクトリを取得する必要があります。あなたが実際にも追記に、Ninjectは、それが1つとして使用することができるにもかかわらず、実際にサービスロケータをイマイチ、(あなたが.Rebindを呼び出すことができます前に、.Bindを呼び出す必要があります)すべてのNHibernateConfigurationをバインドhaventはあなたの例では

Bind<ISession>().ToMethod(x => x.Kernel.Get<ISessionFactory>() 
       .OpenSession()); 
関連する問題