与Fluent NHibernate和Ninject的多个会话

与Fluent NHibernate和Ninject的多个会话,nhibernate,fluent-nhibernate,ninject,Nhibernate,Fluent Nhibernate,Ninject,我正在建立一个多租户、独立的数据库应用程序,在阅读下面关于stackoverflow的文章后,我取得了一些好的进展 我看到正在设置两个会话。一个是用于获取租户信息的“主”会话,然后是特定于子域的租户会话。我的应用程序很好地切换到基于域的指定数据库,并且对如何设置“主”数据库会话以及如何使用它有疑问 我尝试为主会话专门注册一个新会话,但发现一个关于已注册ISession的错误 我是nHibernate的新手,不确定这条路的最佳路线 NinjectWebCommon.cs kernel.Bind&

我正在建立一个多租户、独立的数据库应用程序,在阅读下面关于stackoverflow的文章后,我取得了一些好的进展

我看到正在设置两个会话。一个是用于获取租户信息的“主”会话,然后是特定于子域的租户会话。我的应用程序很好地切换到基于域的指定数据库,并且对如何设置“主”数据库会话以及如何使用它有疑问

我尝试为主会话专门注册一个新会话,但发现一个关于已注册ISession的错误

我是nHibernate的新手,不确定这条路的最佳路线

NinjectWebCommon.cs

kernel.Bind<WebApplication1.ISessionSource>().To<NHibernateTenantSessionSource>().InSingletonScope();
kernel.Bind<ISession>().ToMethod(c => c.Kernel.Get<WebApplication1.ISessionSource>().CreateSession());
kernel.Bind<ITenantAccessor>().To<DefaultTenantAccessor>();
 public Tenant GetCurrentTenant()
    {
      var host = HttpContext.Current.Request.Url != null ? HttpContext.Current.Request.Url.Host : string.Empty;

      var pattern = ConfigurationManager.AppSettings["UrlRegex"];
      var regex = new Regex(pattern);
      var match = regex.Match(host);

      var subdomain = match.Success ? match.Groups[1].Value.ToLowerInvariant() : string.Empty;
      Tenant tenant = null;

      if (subdomain != null)
      {
        // Get Tenant info from Master DB.
        // Look up needs to be cached
        DomainModel.Master.Tenants tenantInfo;

        using (ISession session = new NHibernateMasterSessionSource().CreateSession())
        {
            tenantInfo = session.CreateCriteria<DomainModel.Master.Tenants>()
                .Add(Restrictions.Eq("SubDomain", subdomain))
                .UniqueResult<WebApplication1.DomainModel.Master.Tenants>();
        }

        var connectionString = string.Format(ConfigurationManager.AppSettings["TenanatsDataConnectionStringFormat"], 
            tenantInfo.DbName, tenantInfo.DbUsername, tenantInfo.DbPassword);

        tenant = new Tenant();
        tenant.Name = subdomain;
        tenant.ConnectionString = connectionString;
      }

      return tenant;
    }
kernel.Bind().To().InSingletonScope();
kernel.Bind().ToMethod(c=>c.kernel.Get().CreateSession());
kernel.Bind().To();
ITenantAccessor.cs

kernel.Bind<WebApplication1.ISessionSource>().To<NHibernateTenantSessionSource>().InSingletonScope();
kernel.Bind<ISession>().ToMethod(c => c.Kernel.Get<WebApplication1.ISessionSource>().CreateSession());
kernel.Bind<ITenantAccessor>().To<DefaultTenantAccessor>();
 public Tenant GetCurrentTenant()
    {
      var host = HttpContext.Current.Request.Url != null ? HttpContext.Current.Request.Url.Host : string.Empty;

      var pattern = ConfigurationManager.AppSettings["UrlRegex"];
      var regex = new Regex(pattern);
      var match = regex.Match(host);

      var subdomain = match.Success ? match.Groups[1].Value.ToLowerInvariant() : string.Empty;
      Tenant tenant = null;

      if (subdomain != null)
      {
        // Get Tenant info from Master DB.
        // Look up needs to be cached
        DomainModel.Master.Tenants tenantInfo;

        using (ISession session = new NHibernateMasterSessionSource().CreateSession())
        {
            tenantInfo = session.CreateCriteria<DomainModel.Master.Tenants>()
                .Add(Restrictions.Eq("SubDomain", subdomain))
                .UniqueResult<WebApplication1.DomainModel.Master.Tenants>();
        }

        var connectionString = string.Format(ConfigurationManager.AppSettings["TenanatsDataConnectionStringFormat"], 
            tenantInfo.DbName, tenantInfo.DbUsername, tenantInfo.DbPassword);

        tenant = new Tenant();
        tenant.Name = subdomain;
        tenant.ConnectionString = connectionString;
      }

      return tenant;
    }
公共租户GetCurrentTenant()
{
var host=HttpContext.Current.Request.Url!=null?HttpContext.Current.Request.Url.host:string.Empty;
var pattern=ConfigurationManager.AppSettings[“UrlRegex”];
var regex=新的regex(模式);
var match=regex.match(主机);
var subdomain=match.Success?match.Groups[1]。Value.ToLowerInvariant():string.Empty;
租户=null;
if(子域!=null)
{
//从主数据库获取租户信息。
//查找需要缓存
DomainModel.Master.Tenants租户信息;
使用(ISession session=new NHibernateMasterSessionSource().CreateSession())
{
tenantInfo=session.CreateCriteria()
.Add(Restrictions.Eq(“子域”,子域))
.UniqueResult();
}
var connectionString=string.Format(ConfigurationManager.AppSettings[“TenanatsDataConnectionStringFormat”],
tenantInfo.DbName、tenantInfo.DbUsername、tenantInfo.DbPassword);
租户=新租户();
tenant.Name=子域;
tenant.ConnectionString=ConnectionString;
}
归还承租人;
}

感谢您花时间进行此操作。

添加另一个会话绑定并添加一些条件。例如

kernel
    .Bind<ISession>()
    .ToMethod(c => c.Kernel.Get<NHibernateMasterSessionSource>().CreateSession())
    .WhenInjectedInto<TenantEvaluationService>();
内核
.Bind()
.ToMethod(c=>c.Kernel.Get().CreateSession())
.当输入到()时;

添加另一个会话绑定并添加一些条件。例如

kernel
    .Bind<ISession>()
    .ToMethod(c => c.Kernel.Get<NHibernateMasterSessionSource>().CreateSession())
    .WhenInjectedInto<TenantEvaluationService>();
内核
.Bind()
.ToMethod(c=>c.Kernel.Get().CreateSession())
.当输入到()时;

您的问题是什么?如何在我正在工作的租户会话之外设置“主”会话。示例:打开主会话以根据子域从主数据库获取租户信息。您的问题是什么?除了我正在工作的租户会话之外,如何设置“主”会话。示例:打开主会话以基于子域从主数据库获取租户信息。