2012-02-22 2 views
0

Я заявивших свои привязок Ninject в NinjectModule так:Ninject + NHibernate с двумя или несколькими базами данных

public override void Load() 
{ 
    Bind<ISessionFactory>().ToMethod(c => SessionFactory1.SessionFactory).InSingletonScope().Named("d1"); 
    Bind<ISessionFactory>().ToMethod(c => SessionFactory2.SessionFactory).InSingletonScope().Named("d2"); 

    Bind<ISession>().ToMethod(c => c.Kernel.Get<ISessionFactory>("d1").OpenSession()).Named("d1"); 
    Bind<ISession>().ToMethod(c => c.Kernel.Get<ISessionFactory>("d2").OpenSession()).Named("d2"); 

    Bind(typeof(IReadOnlyRepository<,>)).To(typeof(Repository<,>)).Named("d1").WithConstructorArgument("session", c => c.Kernel.Get<ISession>("d1")); 
    Bind(typeof(IReadOnlyRepository<,>)).To(typeof(Repository<,>)).Named("d2").WithConstructorArgument("session", c => c.Kernel.Get<ISession>("d2")); 
} 

Если пробег а к Разрешеня IReadonlyRepository я получаю исключение из Ninject (ActivationException: Ошибка активации Repository {ulong, Workflow}) может ли кто-нибудь обнаружить ошибку в моей конфигурации привязки?

IReadOnlyRepository repository1 = kernel.Get<Repository<UInt64, Workflow>>("d1"); 
+0

Попробуйте использовать другое имя для сессии и хранилища, например, «s1» и «s2» для ISessions и «r1», «r2» для IReadOnlyRepository –

ответ

0

Попробуйте с другим именем, как это:

public override void Load() 
     { 
      Bind<ISessionFactory>().ToMethod(c => SessionFactory1.SessionFactory).InSingletonScope().Named("d1"); 
      Bind<ISessionFactory>().ToMethod(c => SessionFactory2.SessionFactory).InSingletonScope().Named("d2"); 

      Bind<ISession>().ToMethod(c => c.Kernel.Get<ISessionFactory>("d1").OpenSession()).Named("s1"); 
      Bind<ISession>().ToMethod(c => c.Kernel.Get<ISessionFactory>("d2").OpenSession()).Named("s2"); 

      Bind(typeof(IReadOnlyRepository<,>)).To(typeof(Repository<,>)).WithConstructorArgument("session", c => c.Kernel.Get<ISession>("s1")).Named("r1"); 
      Bind(typeof(IReadOnlyRepository<,>)).To(typeof(Repository<,>)).WithConstructorArgument("session", c => c.Kernel.Get<ISession>("s2")).Named("r2"); 
     } 

IReadOnlyRepository repository1 = kernel.Get<IReadOnlyRepository>("r1"); 
+0

Спасибо за предложение @Max Zerbini, но я пробовал это. Он работает, если у меня есть привязка только к одному ISessionFactory и ISession, а привязка к репозиторию без имени. – Filip

+0

Какая у вас ошибка, если вы используете код примера? –

+0

см. Мой отредактированный код –