C# 具有两个或多个数据库的Ninject+NHibernate

C# 具有两个或多个数据库的Ninject+NHibernate,c#,nhibernate,ninject,C#,Nhibernate,Ninject,我在Ninject模块中声明了我的Ninject绑定,如下所示: public override void Load() { Bind<ISessionFactory>().ToMethod(c => SessionFactory1.SessionFactory).InSingletonScope().Named("d1"); Bind<ISessionFactory>().ToMethod(c => SessionFactory2.Sessi

我在Ninject模块中声明了我的Ninject绑定,如下所示:

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"));
}
如果运行a来解析IReadonlyRepository,我会从Ninject ActivationException获得一个异常:激活存储库时出错{ulong,Workflow}有人能在我的绑定配置中发现错误吗

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

尝试使用以下不同的名称:

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");

尝试为会话和存储库使用不同的名称,例如s1和s2代表ISessions,r1 r2代表iReadonlyRepository感谢@Max Zerbini的建议,但我已经尝试过了。如果我只绑定到一个ISessionFactory和ISession,而到存储库的绑定没有名称,那么它就可以工作。我从Ninject获得一个ActivationException,无论是在存储库还是ISession上。我一直在读Ninject的文章,怀疑我想用这种方式做的事情是不可能的。问题是,当添加存储库绑定时,Ninject已经知道ISession,而WithConstructorArgument并没有像我想的那样工作。我在尝试Ninject,在花了几乎一整天的时间之后,我放弃了。接下来我将尝试另一个DI框架。