2012-02-09 2 views
1

В строке подключения я должен динамически передавать значение loggeduserid, используя имя приложения атрибута = userid в строке подключения и попадая в SQL Server с помощью запроса, выберите app_name().Проблема Rebind NInject при динамическом изменении строки подключения

Используемые технологии: 1) .NET 4.0 2) NHibernate 3) Ninject

Перед авторизованы я использую Ninject IoC контейнер и NHibernate, чтобы загрузить строку соединения без имени атрибута приложения и после того, как записан в Я передаю вошли идентификатор пользователя в качестве значения конструктора и подменой класс 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.

Пожалуйста, помогите мне, как пересвязать класс NHibernateConfiguration с помощью Ninject

+0

в вашем примере вы на самом деле нету связаны NHibernateConfiguration на всех (вам нужно позвонить .bind перед вызовом .Rebind), а также на Замечание, Ninject разве на самом деле локатор службы, даже если она может быть использована в качестве одного , обычно ninject используется в сценариях впрыска конструктора/параметра –

ответ

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()); 
Смежные вопросы