如何使用控制器将不同的 NHibernate 会话(多数据库)注入到同一个存储库中,并使用 Ninject 控制哪些会话

2023-12-20

使用: ASP.NET MVC3 忍者2 流畅的nHibernate

我有 2 个数据库(DB1 和 DB2)。我有一个基本存储库类(Repository)和许多控制器(Controller1、Controller2)。

public MyController(IRepository<SomeModelFromDB1> someModelFromDB1Repository, IRepository<SomeModelFromDB2> someModelFromDB2Repository)
{
    [...]
}

public class Repository<T> : IRepository<T> where T : Entity
{
    private readonly ISession _session;

    public Repository(ISessionFactory sessionFactory)
    {
        _session = sessionFactory.OpenSession();
    }
}

public class DB1SessionFactory : ISessionFactory
{
    private readonly NHibernate.ISessionFactory _sessionFactory;

    private ISession _session;

    public DB1SessionFactory()
    {
        [...]
    }
}

public class DB2SessionFactory : ISessionFactory
{
    private readonly NHibernate.ISessionFactory _sessionFactory;

    private ISession _session;

    public DB2SessionFactory()
    {
        [...]
    }
}

现在当我创建 MyController.我希望注入我的存储库,但该存储库应该使用 DB1(或 DB2,具体取决于模型)SessionFactory。

我不知道如何正确地注入它们......当我只有一个 SessionFactory (DB1) 时,这是我使用 NINJECT 得到的:

kernel.Bind<ISessionFactory>().To<DB1SessionFactory>()
            .InRequestScope();

kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>));

Edit:

最好的办法是根据模型将正确的会话注入到存储库中。由于某些模型来自 DB1,其他模型来自 DB2,因此选择应该依赖于它。如果控制器/视图开发人员不必费心做任何事情(比如在存储库前面添加 [Named]),但如果它需要的话,那就太好了。即使使用 [Named],我也无法弄清楚如何根据控制器中的 [Named] 存储库在存储库中注入正确的会话......


首先,您应该在单例范围中定义会话工厂,并将会话放在请求范围中。

像这样进行配置:

.Bind<ISessionFactory>().To<DB1SessionFactory>().Named("DB1")
     .InSingletonScope();

.Bind<ISessionFactory>().To<DB2SessionFactory>().Named("DB2")
     .InSingletonScope();

private bool IsOnDB(IRequest request, string dbName)
{
    var repositoryType = request.ParentRequest.Service;
    var modelType = repositoryType.GetGenericArguments()[0];
    var databaseName = this.GetDatabaseForModel(modelType);

    return databaseName == dbName;
}

.Bind<ISession>()
    .ToMethod(ctx => ctx.Kernel.Get<ISessionProvider>("DB1").OpenSession())
    .When(r => this.IsOnDb(r, "DB1"))
    .InRequestScope();
.Bind<ISession>()
    .ToMethod(ctx => ctx.Kernel.Get<ISessionProvider>("DB2").OpenSession())
    .When(r => this.IsOnDb(r, "DB2"))
    .InRequestScope();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用控制器将不同的 NHibernate 会话(多数据库)注入到同一个存储库中,并使用 Ninject 控制哪些会话 的相关文章

随机推荐