0

私はマルチテナントの独立したデータベース アプリケーションのセットアップに取り組んでおり、以下のスタックオーバーフローに関するこの投稿を読んで、ある程度の進歩を遂げました。

Fluent nHibernate と Ninject によるマルチテナンシー。テナントごとに 1 つのデータベース

2 つのセッションがセットアップされているのがわかります。1 つはテナント情報を取得するために使用される「マスター」セッションで、次にサブドメインに固有のテナント セッションです。ドメインに基づいて指定されたデータベースにアプリをうまく切り替えることができ、「マスター」データベース セッションのセットアップ方法とその使用方法について質問があります。

マスター セッション専用の新しいセッションを登録しようとしましたが、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>();

ITenantAccessor.cs

 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;
    }

お時間をいただきありがとうございます。

4

1 に答える 1

3

別のセッション バインディングを追加し、いくつかの条件を追加します。例えば

kernel
    .Bind<ISession>()
    .ToMethod(c => c.Kernel.Get<NHibernateMasterSessionSource>().CreateSession())
    .WhenInjectedInto<TenantEvaluationService>();
于 2012-11-16T01:52:08.873 に答える