【发布时间】:2012-10-29 17:56:00
【问题描述】:
我正在建立一个多租户、独立的数据库应用程序,并且通过阅读下面关于 stackoverflow 的这篇文章取得了一些不错的进展。
Multitenancy with Fluent nHibernate and Ninject. One Database per Tenant
我看到正在设置两个会话。一种是将用于获取租户信息的“主”会话,然后是特定于子域的租户会话。我有应用程序很好地切换到基于域的指定数据库,并且对如何设置“主”数据库会话以及如何使用它有疑问。
我尝试专门为主会话注册一个新会话,但收到关于已注册 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;
}
感谢您抽出宝贵时间。
【问题讨论】:
-
你的问题到底是什么?
-
除了我正在工作的租户会话之外,如何设置“主”会话。示例:打开主会话,根据子域从主数据库获取租户信息。
标签: nhibernate fluent-nhibernate ninject